java - 按任意步长旋转数组而不创建第二个数组

标签 java arrays performance algorithm

所以对于步长 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/

相关文章:

java - 导入和扩展

java - 如何获取Gridlayout的坐标

c++ - 使用结构的队列(出租车调度问题)

java - java中的速率控制

java - Jena Fuseki 客户端

java - float 表示,Java 示例

python - 确保 np.random.choice() 的列表内容总和为 1

arrays - 如果数组末尾的额外元素在嵌套循环的下一次迭代中更短,如何计算数组末尾的额外元素

php - 在 php 文件中或通过 mysql 手动计算?

r - 基于自定义距离函数优化R代码创建距离矩阵