2016-08-04 15 views
0

私はごととして、私はランタイムエラーを取得しています4のテストのいずれかに挿入ソートアルゴリズムここでランタイムエラーにつながる論理エラーはありますか?

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

の手順を印刷したコードの一部を持っています。問題は、ランタイムエラーやテストケースが(実際にサイトでアカウントを購入していない限り)表示されないことです。ですから、私はその問題を推測したり考えたりしなければなりません。私はすでにループの前にエラーを受け取り、

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

を追加しようとしました。あなたのforループを見てみると

+0

あなたの配列がそれにインデックスを付ける前に、空である場合は、確認しましたか? – Sherlock

+0

あなたはelmahをインストールしてそこにエラーを見ることができます。あなたが – lordkain

+0

を期待することはありませんその他のエラーのためalse便利であなただけの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のような他のコーナーケースがありますが、私は挑戦が、そのような可能性を除外と思います。

関連する問題