【问题标题】:What logic error could be leading to a runtime error here?什么逻辑错误可能会导致运行时错误?
【发布时间】:2016-08-04 08:14:55
【问题描述】:

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

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,在 4 个测试之一中,我遇到了运行时错误。问题是,我看不到运行时错误或测试用例是什么(除非我真的在网站上购买了一个帐户)。所以我必须猜测并检查或思考问题。我已经尝试添加一个

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

在循环之前,但仍然出现错误。

【问题讨论】:

  • 您是否在索引之前验证了您的数组是否为空?
  • 你可以安装 elmah 并在那里看到错误。对您意想不到的其他错误也很有用
  • 你能不能把整个东西包装在一个 Try..Catch 块中并在 Catch 块中执行 Console.WriteLine 来找出错误是什么? (仅用于调试目的)
  • 您的 for 循环无法防止 i 降至零以下。
  • 这是您的代码失败的测试用例:第一行:10 第二行:2 3 4 5 6 7 8 9 10 1 //我免费购买了它

标签: c# algorithm sorting insertion-sort


【解决方案1】:

看看你的for循环,很容易看出如果没有小于或等于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 &lt; 2这样的其他极端情况,但我认为挑战排除了这种可能性。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2021-07-02
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多