Следующий код всегда возвращает false по какой-то причине, когда этого не должно быть

#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.