2016-08-01 5 views
-1

Ich kann nicht herausfinden, was ich hier falsch mache.Wo ist der Fehler in meinem Algorithmus, um alle Paare in einem Array zu finden, deren Summe k teilt?

Code:

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

Eingang:

6 3 
1 3 2 6 1 2 

Erwartete Ausgabe:

5 

Meine Ausgabe:

1 
+0

'wählen 1) .ToList() Count/2', warum machst du das? – user3185569

+0

@ user3185569 Ich dividiere durch 2, um Wiederholungen zu berücksichtigen – user6048670

+0

Und warum sollte ich weniger als j sein? und warum verwendest du nicht den ersten Wert in linesParts, der 6 ist? Kannst du wenigstens erklären, warum du jeden Schritt machst? – user3185569

Antwort

2

Zuerst müssen Sie nicht durch 2 teilen. Aufgrund der where i < j Bedingung gibt es keine Wiederholungen.

Zweitens: Sie müssen Enumerable.Range(0, arr.Length) (keine -1) verwenden, da der zweite Parameter nicht die obere Grenze ist, sondern die Anzahl der Elemente.

So sollte Ihr Code sein.

... 
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

Ich denke, dass er durch 2 dividiert, um die Anzahl der Paare zu erhalten und doppelte Pässe nicht zu überspringen. – user3185569

+0

Sie erhalten für jede passende Bedingung "1", d. H. Sie erhalten die Anzahl der Paare (= 5: 1,2/1,2/3,6/2,1/1,2). Ihr Ansatz würde auch 5 als Ergebnis erhalten, aber Sie verwenden auch die falschen 'Enumerable.Range'-Parameter. – Fratyx

+0

Oder zu verwenden ** Index ** Paare: 0,2/0,5/1,3/2,4/4,5 – Fratyx

Verwandte Themen