2016-12-21 2 views
-1

Я пытаюсь найти первые недостающие положительные целые числа в массиве, и я продолжаю получать это сообщение об ошибке. Я новичок в программировании, и я не могу понять причину этого. Может ли кто-нибудь помочь мне найти проблему? Кроме того, когда вход [1], он также генерирует исключение.Ошибка «Index was out of range exception»

Это мой код:

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

Можете ли вы добавить также массив ввода? –

+0

Что такое * недостающее положительное число *, пожалуйста? –

+2

'(An [An.count])' следует изменить на '(An [An.count-1])'. Массивы основаны на нуле, но 'count' вернет количество элементов в' An', которое будет основано на – Aidin

ответ

0

Вы испытываете ошибку на единицу:

В вашем for цикла вы используете это условие выхода:

i <= lengthList - 1 

ON список, например, 10 элементов, которые будут повторяться до 9.

Затем вы получаете доступ к массиву как это:

An[i + 1] 

В данном примере вы получите доступ к [10], который не существует в массиве/списке из 10 элементов.

Ваше правильное утверждение выход для петли:

i < lengthList - 1 

Юр расчет lengthList, кажется, тоже неправильно. Измените его на:

int lengthList = An.Count; 

Ваш исходный код

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

... дает также ArgumentOutOfRangeException. Это также не имеет смысла. Вы получаете доступ к содержимому , а не его длина.

Sidenote:

Ваше Начальное условие цикла

int i = An[0] 

..., вероятно, тоже неправильно. Вы имели в виду это?

int i = 0 
+1

Единственная проблема заключается в том, что переменная _lengthList_ является полностью неправильной. Он не измеряет длину массива. – Steve

+0

@Steve: Проверьте мое редактирование. – Sefe

3

У вас есть несколько недостатков в коде. Наиболее важным является

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

Что должно быть? Длина An - количество товаров в An, вы можете перебрать - дано An.Count.

А поскольку списки 0 индексированные, ваш индекс i должен идти от 0 (не An[0]) в An.Count-1. Так что ваш код должен выглядеть следующим образом:

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 избегает доступа к индексу после последнего пункта.

Обратите внимание, что это только исправляет это IndexOutOfRangeException. Я не знаю, делает ли алгоритм то, что вы хотите вообще. Вы вставить элементов в Anпри повторении над ним (линия An.Insert...). Это кажется мне неправильным.

+0

благодарит за вашу помощь. Я настоящий новичок, и я не могу понять, как это сделать. Как получить наименьшее пропущенное положительное целое число? Я пробовал так много способов, и ничего не работает. Заранее спасибо. –

+0

@yehudisgrosz Извините, но это не служба написания кода. Продолжайте пытаться, и вы поймете это. И, узнав сами, вы узнаете больше, чем путем копирования кода из Интернета. И, как предложили другие, используйте отладчик, чтобы пройти через свой код шаг за шагом и посмотреть, что пойдет не так и почему. –

0

код проблемы:

1) ([An.Count]) устанавливает, что: [An.Count-1]

2) INT lengthList = (An [An.Count]) - (An [0]); исправить: int lengthList = An.Count;