我写了一个方法,它接受一个数字数组并移动数字,并返回移位数组。
如下:
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}
答案 0 :(得分: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撰写的“珍珠编程”一书有一个类似于旋转阵列的算法。)