2016-08-04 3 views
0

는 내가 삽입 정렬 알고리즘어떤 논리 오류로 인해 런타임 오류가 발생할 수 있습니까?

using System; 
using System.Collections.Generic; 
using System.IO; 
class Solution 
{ 
    static void Main(String[] args) 
    { 
     Console.ReadLine(); 
     int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse); 
     Func<int[], string> IntArrayToString = (x) => string.Join(" ", Array.ConvertAll(x, k => k.ToString())); 
     for(int i = arr.Length - 2, last = arr[arr.Length - 1]; ; --i) 
     { 
      if(arr[i] > last) 
      { 
       arr[i + 1] = arr[i]; 
       Console.WriteLine(IntArrayToString(arr)); 
      }     
      else 
      { 
       arr[i + 1] = last; 
       break; 
      } 
     } 
     Console.WriteLine(IntArrayToString(arr)); 
    } 
} 
에 따라

내가 런타임 오류가있어 4 테스트 중 하나의 단계를 출력 코드의 조각을 가지고있다. 문제는, 런타임 오류 또는 테스트 케이스가 무엇인지 (실제로 사이트에서 계정을 구매하지 않는 한) 볼 수 없습니다. 그래서 저는 문제를 추측하고 생각하거나 생각해야합니다. 이미 루프 이전에

if(arr.Length < 2) 
{ 
    Console.WriteLine(IntArrayToString(arr)); 
    return; 
} 

을 추가했지만 오류가 계속 발생했습니다. 당신의 for 루프를 보면

+0

색인을 생성하기 전에 배열이 비어 있는지 확인 했습니까? – Sherlock

+0

elmah를 설치하면 거기에 오류가 표시됩니다. 당신이 결코 기대하지 않는 다른 에러들도 유용 할 것입니다. – lordkain

+0

Try..Catch 블록에서 모든 것을 랩핑하지 않고 Catch 블록에서 Console.WriteLine을 사용하여 오류가 무엇인지 찾아 낼 수 있습니까? (디버깅 목적으로 만) –

답변

1

, 쉽게 더 작은 값 또는 동일 last에있는 경우, break가 충돌하지 않습니다 것을 알 수 있으며, i-1이되면, 당신은 'IndexOfRangeExpection을 얻을 것이다.

올바른 알고리즘을 사용하려면 ilast을 루프 외부에서 정의해야합니다. 이 같은 인스턴스의 경우 : 물론

int i = arr.Length - 1; 
int last = arr[i]; 
while (--i >= 0 && arr[i] > last) 
{ 
    arr[i + 1] = arr[i]; 
    Console.WriteLine(IntArrayToString(arr)); 
} 
arr[i + 1] = last; 

arr.Length < 2 같은 다른 코너 경우가 있습니다,하지만 난 도전은 가능성을 배제 생각합니다.

관련 문제