Использование методов return vs while (condition) для прерывания циклов - PullRequest
1 голос
/ 26 марта 2020

Я делаю небольшой вопрос об интервью в Google. Найдите пару чисел в al oop, которые складываются с указанным числом. Я нашел числа 2 и 6, которые составляют 8, поэтому я говорю match = true, так что пока l oop останавливается, однако он продолжается до тех пор, пока не найдет второе, равное 6 и 2, однако те числа, которые я уже нашел, просто наоборот, и я ожидал, что мой l oop сломается, так как мой оператор if утверждает, что если есть какие-либо 2 числа, которые дают сумму, match = true, следовательно, завершая l oop, я думаю, что я ошибаюсь.

Однако, если я избавлюсь от оператора while и просто вернусь; как только совпадение найдено, оно разрывается без поиска второго совпадения (что я и хочу).

Почему это происходит, логика c обоих кажется мне абсолютно одинаковой.

Использование метода while (условие)

public class Main {

    public static void main(String[]args){
        int[] list = new int[]{1,2,1,1,1,6};
        boolean match = false;
        int sumNeeded = 8;



        while(!match){
            for(int i = 0; i < list.length; i ++){
                for(int j = (list.length -1); j >= 0; j --){
                    if(list[i] != list[j]){
                        if(list[i] + list[j] == sumNeeded){
                            System.out.println("The numbers are = " + list[i] + " & " + list[j]);
                            match = true;
                        }
                    }
                }
            }
        }
    }
}

Использование return


public class Main {

    public static void main(String[]args){
        int[] list = new int[]{1,2,1,1,1,6};
        int sumNeeded = 8;



        for(int i = 0; i < list.length; i ++){
            for(int j = (list.length -1); j >= 0; j --){
                if(list[i] != list[j]){
                    if(list[i] + list[j] == sumNeeded){
                        System.out.println("The numbers are = " + list[i] + " & " + list[j]);
                        return;
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

В вашей реализации while-l oop, если массив не имеет нужной пары вообще, это приведет к бесконечному l oop. В вашем решении нет необходимости использовать оператор while.

После ввода в while l oop вы ищите все возможные пары в массиве, а затем проверяете их сумму. Если она равна желаемой сумме, вы устанавливаете логическую переменную равной true.

Но до тех пор, пока вложенность для l oop не будет выполнена полностью (т.е. проверены все возможные пары), мы не проверяем условие while. Все вложенное для l oop выполняется за одну итерацию, а l oop Затем условие while l oop проверяется снова.

Поскольку к концу первой итерации, в то время как l oop учитываются все возможные пары, на некоторое время не требуется l oop.

Более того, существует другие логические ошибки в вашей реализации. Правильная реализация грубой силы выглядит следующим образом:

public class Main {

public static void main(String[]args){
    int[] list = new int[]{1,2,1,1,1,6};
    boolean match = false;
    int sumNeeded = 8;




    for(int i = 0; i < list.length; i ++){
       for(int j = (list.length -1); j > i; j --){
          if(list[i] + list[j] == sumNeeded){
             System.out.println("The numbers are = " + list[i] + " & " + list[j]);
             return;
          }
       }
    }
  }
}

Внутренний для l oop модифицируется для уменьшения двойного счета неупорядоченных пар. Всякий раз, когда совпадение найдено и напечатано, мы покидаем функцию.

Вы также можете добавить оператор break в while l oop в вашей первоначальной реализации.

if(match == true) {
     break;
}
1 голос
/ 26 марта 2020

Условие while продолжает выполнение первого и второго для -l oop до тех пор, пока не будет завершено, тогда как при возврате оно полностью прекращает выполнение с первого и второго l oop.

Чтобы исправить время l oop, вы можете использовать метку, а затем отказаться от нее.

firstLoop:
for(int i = 0; i < list.length; i ++) {
match = true;
break firstLoop;
...