2016-08-01 1 views
-1

ここで間違っていることを理解できません。私のアルゴリズムの欠陥は、合計がkで割れる配列内のすべてのペアを見つけることができますか?

コード:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
class Solution 
{ 
    static void Main(String[] args) 
    { 
     string[] lineParts = Console.ReadLine().Split(' '); 
     int k = Convert.ToInt32(lineParts[1]); 
     int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse); 
     var indices = Enumerable.Range(0, arr.Length - 1); 
     int pairsDivideK = (from i in indices 
          from j in indices 
          where i < j && ((arr[i] + arr[j]) % k == 0) 
          select 1).ToList().Count/2; 
     Console.WriteLine(pairsDivideK); 
    } 
} 

入力:

6 3 
1 3 2 6 1 2 

予想される出力:

5 

マイ出力:

1 
+0

は '1).ToList()/カウントを選択2'なぜあなたはこれをやっていますか? – user3185569

+0

@ user3185569私はリピートを説明するために2で割っています – user6048670

+0

そしてなぜ私はj​​よりも小さくすべきですか? linesPartsの最初の値が6でない理由は何ですか?なぜあなたはそれぞれのステップをやっているのですか? – user3185569

答えて

2

まずは2で割る必要はありません。where i < jという条件のため、繰り返しはありません。

第2パラメータ:第2パラメータは上限ではなく要素の数であるため、Enumerable.Range(0, arr.Length)(no -1)を使用する必要があります。

は、だからあなたのコードは次のようになります。

... 
var indices = Enumerable.Range(0, arr.Length); 
int pairsDivideK = (from i in indices 
        from j in indices 
        where i < j && ((arr[i] + arr[j]) % k == 0) 
        select 1).ToList().Count; 
Console.WriteLine(pairsDivideK); 
+0

彼はペア数を得るために2で割っていると思うし、重複パスをスキップしないと思う。 – user3185569

+0

一致する条件ごとに「1」を取得します。つまり、ペア数(= 5:1,2/1,2/3,6/2,1/1,2)を取得します。あなたのアプローチも結果として5を取得しますが、間違った 'Enumerable.Range'パラメータも使用します。 – Fratyx

+0

**インデックス**ペアを使用する:0,2/0,5/1,3/2,4/4,5 – Fratyx

関連する問題