JAVA LOOP:数字集的总和

时间:2016-11-03 23:11:03

标签: java loops arraylist

我正在努力修复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,因此我可以比较总和是否等于用户输入的TARGET VALUE。

第一个if语句simple比较两个值,然后添加值(如果有效)。第二个语句查看目标值是否在列表中,如果是,则会自动添加。

如果输出值不等于TARGET VALUE,则第三个语句将忽略输出值。

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

ARRAYLIST:8,5,5,2

目标价值:10

输出:5,5,5,5

这是不正确的。输出应为:8,5,5,2!我的循环正在跳过第一次和最后一次比较,并添加了我不想要的额外值。任何人都可以解释如何正确设置这些循环吗?

2 个答案:

答案 0 :(得分:0)

问题在于:

int endLength = length--;

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

您正在更改长度var。

的值

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

答案 1 :(得分:0)

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

E.g:

        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 =&gt;不同否则你会得到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);
            }
        }
    }