#java
#java
Вопрос:
предполагается, что возвращает true, если первая половина массива равна второй, но он возвращает false… Я пробовал отладку, но все еще не работает… Помогите!
public class Main {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 1, 2, 3};
System.out.println(sda(arr));
}//main
public static boolean sda(int[] arr) {
int[] arr2 = new int[arr.length];
int[] arr3 = new int[arr.length];
for(int i = 0; i < (arr2.length/2); i ) {
arr2[i] = arr[i];
}
for(int i = arr.length - 1; i > (arr.length/2) - 1; i--) {
arr3[i] = arr[i];
}
for(int j = 0; j < arr.length/2 - 1; j ) {
if(arr3[j] != arr2[j]) return false;
}
return true;
}
}
есть предложения?
Ответ №1:
Эммм… Что ж, хорошим методом разрешения является отладка по значению
arr2
и
arr3
. Затем вы найдете это:
int arr2[] = {1, 2, 3, 0, 0, 0};
int arr3[] = {0, 0, 0, 1, 2, 3};
Давай! Сделайте это и разрешите это.
Ответ №2:
Если я разберу текущий код: сначала arr2 и arr3 присваиваются пустому массиву из 6 элементов. Следующему arr2 присваиваются значения (1,2,3) в первых 3 элементах массива. Затем arr3 присваивается (1,2,3) в последних 3 элементах массива. Если я добавлю приведенный ниже фрагмент кода во 2-й цикл for:
System.out.println("arr2: ");
for(int i : arr2){
System.out.println(i);
}
System.out.println("arr3: ");
for(int i : arr3){
System.out.println(i);
}
Вы увидите, что эти два параметра отличаются.
arr2:
1
2
3
0
0
0
arr3:
0
0
0
1
2
3
Чтобы результат возвращал true, вы могли бы настроить, куда помещаются значения arr2, или настроить, куда помещаются значения arr3 в массиве.
Альтернативным решением было бы изменить оценку двух значений массива в конечном цикле for на:
for(int j = 0; j < arr.length/2 - 1; j ) {
if(arr3[j (arr.length/2)] != arr2[j]) return false;
}
Таким образом, оценка двух циклов будет для первых 3 значений arr2 по сравнению с последними 3 значениями arr3.
Подводя итог, я изменил метод sda на приведенный ниже:
public static boolean sda(int[] arr) {
int[] arr2 = new int[arr.length];
int[] arr3 = new int[arr.length];
for(int i = 0; i < (arr2.length/2); i ) {
arr2[i] = arr[i];
}
for(int i = arr.length - 1; i > (arr.length/2) - 1; i--) {
arr3[i] = arr[i];
}
for(int j = 0; j < arr.length/2 - 1; j ) {
if(arr3[j (arr.length/2)] != arr2[j]) return false;
}
return true;
}
Ответ №3:
public static boolean sda(int[] arr) {
for(int i=0, j=arr.length/2; i<arr.length/2 || j<arr.length; i , j )
if(arr[i]!=arr[j])
return false;
return true;
}
Комментарии:
1. Возможно, вы захотите выполнить начальную проверку на нечетную длину массива
if ((arr.length % 2) == 1) return false
.2. @pks — Почему ты не написал int j = arr.length/2? Я скопировал ваш код и попытался сделать это с помощью int, и по какой-то причине это не сработало, почему это?
3. Если вам нужно выполнить инициализацию нескольких переменных или манипулирование несколькими переменными, вы можете добиться этого, разделив их запятой(,) в цикле for.