Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ArrayIndexOutOfBounds在hackerrank中出现异常切割木棍_C#_Arrays - Fatal编程技术网

C# ArrayIndexOutOfBounds在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

我正试图在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.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;
}