【问题标题】:Using return vs While(condition) methods To Break Loops使用 return vs While(condition) 方法来打破循环
【发布时间】:2020-07-07 12:25:25
【问题描述】:

我正在做一个小小的谷歌面试问题。在循环中找到与给定数字相加的一对数字。我找到了组成 8 的数字 2 和 6,所以我说 match = true 以便 while 循环停止,但是它仍然继续进行,直到找到第二个 6 和 2 但是,我已经以另一种方式找到了这些数字周围,​​我曾预计我的循环会中断,因为我的 if 语句指出是否有任何 2 个数字给出总和,match = true 因此终止循环,但我想我错了。

但是,如果我摆脱 while 语句并返回;一旦找到匹配项,它就会中断而不寻找第二个匹配项(我想要它)。

为什么会这样,两者的逻辑在我看来完全一样。

使用 while(condition) 方法

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;
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: java loops while-loop return


    【解决方案1】:

    在您的 while 循环实现中,如果数组根本没有所需的对,则会导致无限循环。您的解决方案中不需要 while 语句。

    进入 while 循环后,您会在数组中查找所有可能的对,然后检查它们的总和。如果它等于所需的总和,则使布尔变量匹配为真。

    但是,在嵌套的 for 循环完全执行之前(即检查所有可能的对),我们不会检查 while 条件。整个嵌套的 for 循环在 while 循环的一次迭代中执行。然后,再次检查 while 循环条件。

    由于在 while 循环的第一次迭代结束时,所有可能的对都已计算在内,因此不需要 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;
    
    
    
    
        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;
              }
           }
        }
      }
    }
    

    修改了inner-for循环以减少无序对的重复计数。每当找到并打印匹配项时,我们就退出该函数。

    您还可以在初始实现的 while 循环内添加一个 break 语句。

    if(match == true) {
         break;
    }
    

    【讨论】:

    • 说j大于i,如果i在3,不代表j不能检查索引2和1
    • 哦,等等,因为 i 是 1 而 j 是 3 已经发生,这与 i 是 3 和 j 是一的情况相同
    【解决方案2】:

    while 条件继续执行第一个和第二个 for 循环,直到它完成,而与 return 一样,它完全从第一个和第二个循环停止执行。

    要修复 while 循环,您可以使用标签,然后从中中断。

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

    【讨论】:

    • 但我的 while 语句指出这只能在 match 为 false 时执行,那么为什么当我在循环中的某个点将其设置为 true 时,它​​仍然执行?
    • 但在我的版本中没有将标签设置为 true 并不意味着破坏它,因为循环只是在其为 false 时执行
    • while 循环在两个内部循环都用尽之前不会再次触发,这就是您看到不同行为的原因; return 将突然退出语句,@B.brown。如果在值为 true 之后在 while 循环中添加 break 语句,您将看到相同的行为。打破特定循环将是解决此问题的一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2018-03-23
    • 2020-10-21
    相关资源
    最近更新 更多