簡體   English   中英

查找數組中的3個數字是否加起來

[英]find if 3 numbers in an array add up to a sum

我寫了一種確定數組中是否存在總和的方法。 因此,規則是數組中必須存在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 

該函數只是試圖在集合中找到數字s2,其中s2 = sum-first_number-second_number。 這兩個循環可幫助您遍歷列表中的所有數字,如first_number和last_number。

最后在集合中搜索s2會告訴您s2 + first_number + last_number等於和。

您的代碼無效,因為ij可能指向相同的數字。
此外, assert將總和硬編碼為10

無論如何,沒有設置的主要邏輯是3個嵌套循環:

  • 循環1:循環遍歷所有數字。
  • 循環2:循環遍歷循環1中當前編號之后的所有編號。
  • 循環3:循環遍歷循環2中當前編號之后的所有編號。
  • 如果三個當前數字之和正確,則打印出來。
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);

為了提高性能,可以通過將第三個數字計算為num3 = sum - num1 - num2來優化最內層的循環,然后查看它是否在數字列表中。

為了防止多次使用相同的號碼,第三次檢查的邏輯相反,以檢查來自循環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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM