什么逻辑错误可能导致运行时错误?

时间:2016-08-04 08:14:55

标签: c# algorithm sorting insertion-sort

我有一段代码可以打印插入排序算法的步骤

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

根据this challenge problem和其中一个测试我遇到运行时错误。问题是,我无法看到运行时错误或测试用例是什么(除非我实际在网站上购买了一个帐户)。所以我必须猜测并检查或思考问题。我已经尝试添加

if(arr.Length < 2)
{
    Console.WriteLine(IntArrayToString(arr));
    return;
}
在循环之前

但仍然出现错误。

1 个答案:

答案 0 :(得分:1)

查看您的for循环,可以很容易地看出,如果没有值小于或等于lastbreak将永远不会命中,而{{1} }}变为i,您将获得-1

正确的算法要求在循环外定义IndexOfRangeExpectioni。例如,像这样:

last

当然还有其他角落案例,如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; ,但我认为挑战排除了这种可能性。