0

我写了一个方法,它接受一个数字数组并移动数字,然后返回移动后的数组。

如下:

private static int[] ShiftArray(int[] arr, int shift)
{
    shift = shift % arr.Length; 
    int[] tmpArr = new int[shift];
    for (int i = 0; i < tmpArr.Length; i++)
    {
        tmpArr[i] = arr[arr.Length - 1 - i];
    }
    for (int i = arr.Length - 1; i >= shift; i--)
    {
        int index = Math.Abs(i - shift);
        if (index >= 0)
        {
            arr[i] = arr[index];
        }
    }
     for (int i = 0; i < tmpArr.Length; i++)
        {
            arr[i] = tmpArr[tmpArr.Length - 1 - i];
        }
    return arr;
}

我想改进该方法,使其不会消耗内存。我很高兴知道如何改进它以及如何查看为该方法分配了多少内存?

编辑

示例 1:

Input: int[]{1,2,3,4,5,6}, shift:2
Output: int[]{5,6,1,2,3,4}

示例 2:

Input: int[]{1,2,3,4,5,6}, shift:15
Output: int[]{4,5,6,1,2,3}
4

1 回答 1

0

您可以按如下方式对数组进行就地右旋转:

private static int[] ShiftArray(int[] arr, int shift)
{
    shift = arr.Length - (shift % arr.Length);
    Array.Reverse(arr, 0, shift);
    Array.Reverse(arr, shift, arr.Length-shift);
    Array.Reverse(arr);
    return arr;
}

但是,这并不能完全满足您的规范要求。但它正在向右旋转。

根据您的规格:

编辑:示例 1:输入:int[]{1,2,3,4,5,6}, shift:2 输出:int[]{5,6,1,2,3,4}

示例 2:输入:int[]{1,2,3,4,5,6}, shift:15 输出:int[]{6,5,4,1,2,3}

我的代码输出与您的示例 1 相同,但例如 2 它输出:

5、6、1、2、3、4

这对于右移是正确的(它将始终使元素保持相同的顺序)。

但是您的规范中有一些元素的顺序不同,这意味着它不是真正的右移,而是更复杂的东西。(或者您的规范中有错误!)

(乔恩·本特利(Jon Bentley)的《编程珍珠》一书有一个这样的算法来旋转数组。)

于 2013-05-09T10:41:25.127 回答