所以对于步长 1,我想要数组:
{1, 2, 3, 4}
成为:
{4, 1, 2, 3}
对于大小为 2 的步长,结果将是:
{3, 4, 1, 2}
这是我现在使用的代码:
private static int[] shiftArray(int[] array, int stepSize) {
if (stepSize == 0)
return array;
int shiftStep = (stepSize > array.length ? stepSize % array.length : stepSize);
int[] array2 = new int[array.length];
boolean safe = false;
for (int i = 0; i < array.length; i++) {
if (safe) {
array2[i] = array[i - shiftStep];
}
else {
array2[i] = array[array.length - shiftStep + i];
safe = (i+1) - shiftStep >= 0;
}
}
return array2;
}
代码运行良好,但是否可以在不创建辅助数组(上面代码中的 array2)的情况下实现这一点?
谢谢!
最佳答案
您可以在不创建那么大数组的情况下做到这一点:
// void return type as it shifts in-place
private static void shiftArray(int[] array, int stepSize) {
// TODO: Cope with negative step sizes etc
int[] tmp = new int[stepSize];
System.arraycopy(array, array.length - stepSize, tmp, 0, stepSize);
System.arraycopy(array, 0, array, stepSize, array.Length - stepSize);
System.arraycopy(tmp, 0, array, 0, stepSize);
}
因此对于一个 100,000 的数组和步长为 10,它创建一个 10 元素的数组,将最后 10 个元素复制到其中,稍后复制前 999,990 个元素,然后从临时数组复制回 < em>数组的开始。
关于java - 按任意步长旋转数组而不创建第二个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635397/