什么逻辑错误可能导致此处出现运行时错误?
What logic error could be leading to a runtime error here?
我有一段代码打印了插入排序算法的步骤
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;
}
在循环之前但仍然出现错误。
看看你的 for
循环,很容易看出如果没有小于或等于 last
的值,break
永远不会命中,当 i
变成 -1
,你会得到 IndexOfRangeExpection
.
正确的算法需要在循环外定义 i
和 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;
当然还有像arr.Length < 2
这样的极端情况,但我认为挑战排除了这种可能性。
我有一段代码打印了插入排序算法的步骤
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;
}
在循环之前但仍然出现错误。
看看你的 for
循环,很容易看出如果没有小于或等于 last
的值,break
永远不会命中,当 i
变成 -1
,你会得到 IndexOfRangeExpection
.
正确的算法需要在循环外定义 i
和 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;
当然还有像arr.Length < 2
这样的极端情况,但我认为挑战排除了这种可能性。