2016-12-21 2 views
-1

Ich versuche, die ersten fehlenden positiven Ganzzahlen in einem Array zu finden, und ich bekomme diese Fehlermeldung weiter. Ich bin ziemlich neu in der Programmierung und ich kann den Grund dafür nicht herausfinden. Kann mir jemand helfen, das Problem zu finden? Wenn die Eingabe [1] ist, wird auch eine Ausnahme ausgelöst."Index war außerhalb des Bereichs Ausnahme" Fehler

Dies ist mein Code:

public static int solution(int[] A) 
{ 
    Array.Sort(A); 
    List<int> missing = new List<int>(); 
    List<int> An = new List<int>(); 

    foreach (var r in A) 
    { 
     if (r > 0) 
     { 
      An.Add(r); 
     } 

    } 
    int lengthList = (An[An.Count]) - (An[0]); 

    for (int i = An[0]; i <= lengthList - 1; i++) 
    { 
     if (An[i + 1] != An[i] + 1) 
     { 
      missing.Add(An[i] + 1); 
      An.Insert(i + 1, An[i] + 1); 
     } 
    } 
    if (missing != null) 
    { 
     return missing[0]; 
    } 
    else 
     return 0; 
} 
+0

Können Sie auch Input-Array hinzufügen? –

+0

Was ist * fehlende positive Ganzzahl *, bitte? –

+2

'(An [An.count])' sollte in '(An [An.count-1])' geändert werden. Arrays sind nullbasiert, aber "count" gibt die Anzahl der Elemente in "An" zurück, die auf 0 basieren – Aidin

Antwort

0

Sie sind ein Off-by-one Fehler mit:

In Ihrem for Schleife Sie diese Exit-Bedingung verwenden:

i <= lengthList - 1 

auf einem Liste mit zum Beispiel 10 Elemente, die bis 9 durchlaufen würden.

Dann greifen Sie auf das Array wie dies:

An[i + 1] 

In dem gegebenen Beispiel würden Sie auf An [10] zugreifen, die nicht in einer 10-Punkt-Array/Liste existiert.

Ihre richtige Exit-Anweisung für die Schleife ist:

i < lengthList - 1 

Yur Berechnung von lengthList scheint auch falsch. Ändern Sie ihn auf:

int lengthList = An.Count; 

Ihre Anfangscode

int lengthList = An[An.Count] - An[0]; 

... gibt Ihnen auch ein ArgumentOutOfRangeException. Es macht auch keinen Sinn. Sie greifen auf die Inhalt der Liste, nicht seine Länge.

Nebenbei bemerkt:

Ihre inital Schleifenbedingung

int i = An[0] 

... ist wahrscheinlich auch falsch. Meinst du das?

int i = 0 
+1

Das einzige Problem ist die Tatsache, dass die Variable _lengthList_ total falsch ist. Es misst nicht die Länge des Arrays. – Steve

+0

@Steve: Überprüfen Sie meine Bearbeitung. – Sefe

3

Sie haben mehrere Fehler in Ihrem Code. Das wichtigste ist

int lengthList = (An[An.Count]) - (An[0]); 

Was sollte das sein? Die Länge von An - die Anzahl der Elemente in An, über die Sie iterieren können - wird durch An.Count angegeben.

Und da Listen 0-indiziert sind, sollte Ihr Index i zu Fuß von 0 (nicht An[0]) zu An.Count-1. So sollte der Code wie folgt aussehen:

for (int i = 0; i < An.Count; i++) { 
    if (An[i + 1] != An[i] + 1) { 
     missing.Add(An[i] + 1); 
     An.Insert(i + 1, An[i] + 1); // this will break your algorithm 
} 

i<An.Count vermeidet den Index nach dem letzten Element zugreifen.

Beachten Sie, dass dies nur IndexOutOfRangeException behoben wird. Ich weiß nicht, ob der Algorithmus überhaupt das tut, was Sie wollen. Sie einfügen Elemente zu Anwährend Iterieren darüber (Zeile An.Insert...). Das scheint mir falsch zu sein.

+0

danke für Ihre Hilfe. Ich bin ein echter Anfänger und ich kann nicht herausfinden, wie das geht. Wie bekomme ich die niedrigste fehlende positive Ganzzahl? Ich habe so viele Möglichkeiten ausprobiert und nichts scheint zu funktionieren. Danke im Voraus. –

+0

@yehudisgrosz Sorry, aber dies ist kein Code-Schreibdienst. Versuche es weiter und du wirst es herausfinden. Und wenn Sie es selbst herausfinden, lernen Sie mehr als nur Code aus dem Internet zu kopieren. Und wie andere vorgeschlagen haben: Verwenden Sie einen Debugger, um Schritt für Schritt durch Ihren Code zu gehen und zu sehen, was schief läuft und warum. –

0

Ihr Problem Code:

1) (Ein [An.Count]) beheben, dass: Ein [An.Count-1]

2) int lengthList = (An [An.Count]) - (An [0]); behebe das: int lengthList = An.Count;

Verwandte Themen