为什么这个中断语句不按预期工作?

时间:2017-03-23 21:05:49

标签: java break

我有一个带有break语句的简单代码片段。我试图解决这个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语句之间有什么不同,这样当你第一次找到-cur在set中时你会将cancel更改为false然后break并且只要在每次你找到-cur里面时都指定false来取消并等到循环结束而不是休息。

1 个答案:

答案 0 :(得分:1)

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

例如,请考虑以下输入:

2 2
3 -1 1 -2
1 2

在读取-1和1之后,您将cancel设置为false并突破内循环。下一次通过外部循环,它将-2读入k,你就搞砸了。

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