C# ArrayIndexOutOfBounds在hackerrank中出现异常切割木棍
我正试图在Hackerrank中实现一个问题—切掉棍子。可以发现问题 我的密码是C# ArrayIndexOutOfBounds在hackerrank中出现异常切割木棍,c#,arrays,C#,Arrays,我正试图在Hackerrank中实现一个问题—切掉棍子。可以发现问题 我的密码是 static int[] cutTheSticks(int[] arr) { int n = arr.Length, k = 0; int[] result = new int[n]; Array.Sort(arr); Array.Reverse(arr); while(arr.Length != 0) { result[k] = arr.Leng
static int[] cutTheSticks(int[] arr)
{
int n = arr.Length, k = 0;
int[] result = new int[n];
Array.Sort(arr);
Array.Reverse(arr);
while(arr.Length != 0)
{
result[k] = arr.Length;
k++;
for(int i = 0; i < n; ++i)
{
arr[i] -= arr[arr.Length - 1];
}
}
return result;
}
如何删除此项?必须在赋值之前添加条件k
static int[] cutTheSticks(int[] arr)
{
int n = arr.Length,
k = 0;
int[] result = new int[n];
var arrToBeRemoved = arr.ToList();
Array.Sort(arr);
Array.Reverse(arr);
while (arr.Length != 0)
{
if (k < n)
result[k] = arr.Length;
else
break;
if (k < arrToBeRemoved.Count)
arrToBeRemoved.RemoveAt(k);
arr = arrToBeRemoved.ToArray();
k++;
for (int i = 0; i < arr.Length; ++i)
{
arr[i] -= arr[arr.Length - 1];
}
}
return result;
}
您的代码有几个问题。举几个例子: 您正在为结果数组指定一个固定大小的int[]result=new int[n];,但它的大小完全取决于列表中包含多少重复值 您应该在每次迭代中从数组中删除最小值。但是,您只是在修改值arr[i]=arr[arr.Length-1];,不删除它们,因此数组长度将保持不变,因此当arr.length!=0将始终为真,创建一个无休止的循环。这会导致k++不断递增,直到它达到一个大于数组长度的值,这将导致您得到的异常 由于您应该更改输入数组的大小,因此我建议改为使用列表,下面是一个示例:
List<int> output = new List<int>();
List<int> input = new List<int>(arr);
while (input.Count > 0)
{
output.Add(input.Count);
int min = input.Min();
input.RemoveAll(x => x == min);
input.ForEach(x => x -= min);
}
return output.ToArray();
我会这样做:
static int[] cutTheSticks(int[] arr)
{
List<int> results = new List<int>();
int cutted = 0;
while (cutted != 1)
{
cutted = 0;
int min = GetMin(arr);
if (min == 0)
{
break;
}
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] >= min)
{
arr[i] -= min;
cutted++;
}
}
results.Add(cutted);
}
return results.ToArray();
}
static int GetMin(int[] arr)
{
int min = int.MaxValue;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != 0 && arr[i] < min)
{
min = arr[i];
}
}
return min;
}
考虑到您没有从arr中删除任何元素,arr.Length将在何时进行,这可能会重复=0曾经变得虚假吗?想想你的无限循环中发生了什么,比如k和结果[k]…@Someprogrammerdude是的,我知道循环运行了无限次。如何删除元素?这很有效,但在最后一次迭代中,我想在每次迭代后弹出一个元素,你能为同样的问题提出解决方案吗?
List<int> output = new List<int>();
List<int> input = new List<int>(arr);
while (input.Count > 0)
{
output.Add(input.Count);
int min = input.Min();
input.RemoveAll(x => x == min);
input.ForEach(x => x -= min);
}
return output.ToArray();
static int[] cutTheSticks(int[] arr)
{
List<int> results = new List<int>();
int cutted = 0;
while (cutted != 1)
{
cutted = 0;
int min = GetMin(arr);
if (min == 0)
{
break;
}
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] >= min)
{
arr[i] -= min;
cutted++;
}
}
results.Add(cutted);
}
return results.ToArray();
}
static int GetMin(int[] arr)
{
int min = int.MaxValue;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] != 0 && arr[i] < min)
{
min = arr[i];
}
}
return min;
}