查找数组中的3个数字是否合计为总和

时间:2016-05-08 19:06:45

标签: java arrays sum logic

我编写了一个方法来确定数组中是否存在和。因此规则是数组中必须存在3个数字,以便将它们全部加在一起等于给定的总和。所以在数组{1,2,3,14,12}中,如果我正在寻找6的总和那么2 + 3 + 1将是给我的数字6.从在线研究这可以用一套这样做我有以下功能,但我很难理解逻辑:

public void existsSum(int[] numbers,int sum){

    Set<Integer> set = new HashSet();

    for(int i=0;i<numbers.length;i++){
        int s1=sum - numbers[i];
        for(int j=0;j<numbers.length;j++){
            int s2=s1-numbers[j];
            if(set.contains(s2)) {
                System.out.format("sum of %d + %d + %d gives %d \n", numbers[i], numbers[j],s2, sum);
                assert(numbers[i]+numbers[j]+s2==10);
            }
        }
        set.add(numbers[i]);

    }
}

我不明白s1和s2的意义是什么?谁能向我解释逻辑。该方法本身工作正常,如果我用以下方法运行它会产生正确的结果:

int[] integers = {1,2,3,4,5,6,7,8,9};

        existsSum(integers,10);


 sum of 2 + 7 + 1 gives 10 
 sum of 3 + 5 + 2 gives 10 
 sum of 3 + 6 + 1 gives 10 
 sum of 4 + 3 + 3 gives 10 
 sum of 4 + 4 + 2 gives 10 
 sum of 4 + 5 + 1 gives 10 
 sum of 5 + 1 + 4 gives 10 
 sum of 5 + 2 + 3 gives 10 
 sum of 5 + 3 + 2 gives 10 
 sum of 5 + 4 + 1 gives 10 
 sum of 6 + 1 + 3 gives 10 
 sum of 6 + 2 + 2 gives 10 
 sum of 6 + 3 + 1 gives 10 
 sum of 7 + 1 + 2 gives 10 
 sum of 7 + 2 + 1 gives 10 
 sum of 8 + 1 + 1 gives 10 

2 个答案:

答案 0 :(得分:1)

该函数只是试图找到集合中的数字s2,其中s2 = sum-first_number-second_number。这两个循环可以帮助您迭代列表中的所有数字first_number和last_number。

最后在集合中搜索s2会告诉你s2 + first_number + last_number等于总和。

答案 1 :(得分:1)

您的代码无效,因为ij可能指向相同的数字。
此外,assert将要查找的总和硬编码为10

无论如何,没有set的主逻辑是3个嵌套循环:

  • 循环1:遍历所有数字。
  • 循环2:循环播放来自循环1的当前编号后的所有数字。
  • 循环3:循环通过循环2中当前编号后的所有数字。
  • 如果3个当前数字的总和是正确的,请将其打印出来。
for (int i = 0; i < numbers.length; i++)
    for (int j = i + 1; j < numbers.length; j++)
        for (int k = j + 1; k < numbers.length; k++)
            if (numbers[i] + numbers[j] + numbers[k] == sum)
                System.out.println("sum of %d + %d + %d gives %d\n",
                                   numbers[i], numbers[j], numbers[k], sum);

为了提高性能,可以优化最内层循环,而不是将第3个数字计算为num3 = sum - num1 - num2,然后查看它是否在数字列表中。

为了防止多次使用相同的数字,第3次检查的逻辑将被反转以检查前面来自循环1的当前数字的所有数字,并构建这样的数字集合第一个列表是迭代的。

的伪代码:

set = new set()
for (int i = 0; i < numbers.length; i++)
    for (int j = i + 1; j < numbers.length; j++) {
        num3 = sum - numbers[i] - numbers[j]
        if (num3 in set)
            print("sum of %d + %d + %d gives %d\n",
                  num3, numbers[i], numbers[j], sum);
    }
    add numbers[i] to set
}