【问题标题】:Why doesn't this break statement work as intended?为什么这个 break 语句不能按预期工作?
【发布时间】:2017-03-23 21:05:49
【问题描述】:

我有这个带有 break 语句的简单 sn-p 代码。我试图解决这个http://codeforces.com/contest/787/problem/B。我想出了这个解决方案:

public static void main(String[] args) {
    FastReader in = new FastReader();
    int n = in.nextInt(), m = in.nextInt();
    HashSet<Integer> set = new HashSet<>();
    for(int i=0;i<m;i++){
        set.clear();
        int k = in.nextInt();
        boolean cancel = true;
        for(int j=0;j<k;j++){
            int cur = in.nextInt();
            if(set.contains(-cur)){
                cancel = false;
                break;
            }
            else set.add(cur);
        }
        if(cancel && k!=0){
            System.out.println("YES");
            return;
        }
    }
    System.out.println("NO");
}

它没有通过测试,但是在我删除了 cancel = false 之后的 break 语句的那一刻;线。有用。我似乎无法解释使用 break 语句有什么不同,这样当您第一次在 set 中找到 -cur 时,您会将 cancel 更改为 false 然后 break 并分配 false 以取消每次您在 set 中找到 -cur 并等待直到循环结束并且不中断。

【问题讨论】:

  • break 语句适用于 inner 循环。而cancel 为假,所以外循环继续。

标签: java break


【解决方案1】:

当您突破for(int j=0;j&lt;k;j++) 时,您不会读取该输入行的所有k 数字(除非您已经在最后一个数字)。

例如,考虑这个输入:

2 2
3 -1 1 -2
1 2

在读取了 -1 和 1 之后,您将程序集 cancelfalse 并跳出内部循环。下一次通过外循环时,它会将 -2 读入 k,而你把它搞砸了。

当您删除 break 语句时,您正在正确读取所有数字,因此您的程序可以正常工作。

【讨论】:

  • 谢谢你,我应该明白了。