【问题标题】:JAVA LOOP: Sums of a number setJAVA LOOP:数字集的总和
【发布时间】:2017-03-17 16:51:03
【问题描述】:

我正在努力修复 java 中的循环,如果有人能够帮助我,我将不胜感激。

完整代码:http://pastebin.com/C5SQghFa

循环问题:

for(int i = 0 ; i < length ; i++){
        for(int j = 1 ; j < length ; j++){          
            if(defaultSet.get(i) + defaultSet.get(j) == sum){
                System.out.println("YUP\n" + defaultSet.get(i) + " " + defaultSet.get(j));
                finalSet.add(defaultSet.get(j));
            }else if(defaultSet.get(i) == sum && !finalSet.contains(defaultSet.get(i))){
                finalSet.add(defaultSet.get(i));
            }else{
                System.out.println("NOPE\n" + defaultSet.get(i) + " " + defaultSet.get(j));
            }
        }
    }

我试图通过 ArrayList 运行两次,以便比较总和是否等于用户输入的目标值。

第一个 if 语句简单地比较这两个值,如果有效,则添加该值。第二条语句查看 TARGET VALUE 是否在列表中,如果在,将自动添加。

如果输出值不等于 TARGET VALUE,第三条语句将忽略它们。

我的问题是循环无法正常工作。对于某些输入,它们很好,但例如:

阵列:8、5、5、2

目标值:10

输出:5、5、5、5

这是不正确的。输出应该是:8、5、5、2!我的循环跳过了第一次和最后一次比较,并添加了我不想要的额外值。谁能解释一下如何正确设置这些循环?

【问题讨论】:

    标签: java loops arraylist


    【解决方案1】:

    问题出在一行:

    int endLength = length--;
    

    你应该排除 i 和 j 相同的比较。

    您正在更改长度变量的值。

    您的实现具有 O(n^n) 复杂性,有更有效的方法来实现该功能。

    【讨论】:

    • 这是我之前使用的测试值。我忘了删除那行。我没有使用它,但有人指出我确实有我的 j = 1,而它应该从 j = 0 开始。所以谢谢你,这是我的代码中仍然存在的同一类型的问题!
    【解决方案2】:

    如果你真的想要那个输出,你应该改变两行。

    例如:

            for (int j = 0; j < length; j++) {
                if (defaultSet.get(i) + defaultSet.get(j) == sum && j != i) {
    

    输出(finalSet的内容):

    8, 5, 5, 2
    

    注意:

    • j0 开始考虑所有值
    • j 应该不同于 i => 否则你会得到 8, 5, 5, 5, 5, 2

    这是一个适用于您的特定示例的示例。

    如果你想要更精确的东西,你还应该提供一个规则

    以下输入 8, 5, 5, 5, 210 的预期输出可能有用。是8, 5, 5, 2 还是8, 5, 5, 5, 5, 5, 5, 2 还是别的什么?

    8, 5, 2 呢?是8, 5, 2 还是8, 5, 5, 2 还是别的什么?

    根据你的规则,你也可以有(如果它是总和的一半,它会打印两次元素):

        boolean ok = true;
        for (int a : defaultSet) {
            for (int b : defaultSet) {
                if (a + b == sum) {
                    if (a == b) {
                        if (ok) {
                            finalSet.add(a);
                            finalSet.add(b);
                            ok = false;
                        }
                    } else {
                        finalSet.add(a);
                    }
                } else if (a == sum && !finalSet.contains(a)) {
                    finalSet.add(a);
                }
            }
        }
    

    【讨论】:

    • 非常感谢!我最近添加的是 !finalSet.contains 所以我觉得我需要在第一个循环中使用类似的东西。这完美地解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2016-05-17
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多