2016-05-08 3 views
-1

配列に合計が存在するかどうかを判断するメソッドがあります。したがって、ルールには3つの数字が配列内に存在していなければならず、すべてを一緒に加算すると合計に等しくなります。だから、配列{1,2,3,14,12}で6の和を探していたら、2 + 3 + 1は私に6を与える数字になります。オンラインで調べることで、私はS1、S2の意義が何であるかを理解しない配列内の3つの数値が合計に加算されるかどうかを調べる

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]); 

    } 
} 

:私は動作しますが、イムは、ロジックを理解するに苦労して、以下の機能がありますか?誰かが論理を私に説明することができます。この方法自体は正常に動作し、私は次のようにそれを実行した場合、それは正しい結果が得られます

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 

答えて

1

ijが同じ番号を指している可能性があるため、コードが機能しません。
また、assertは合計をハードコードして10と見なします。

  • ループ1:ループのすべての数スルー

    とにかく、設定されていないメインロジックは3つのネストされたループです。

  • ループ2、ループ3、ループからの電流番号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として3数を計算することによって、最適化することができます。

同じ番号を複数回使用しないようにするには、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 
} 
+0

外側のループは、最後の要素までのすべての道を行かなければならないのはなぜ? –

+1

@BheshGurungなぜか?彼らはどこで止めるべきだとお考えですか? – Dima

1

機能は、単にS2 =和FIRST_NUMBER-second_numberセットに数S2を見つけようとしています。 2つのループは、first_numberとlast_numberのようにリスト内のすべての数値を繰り返し処理するのに役立ちます。

最後に、セット内のs2を検索すると、s2 + first_number + last_numberが合計と等しいことがわかります。

関連する問題