旋转数组中的四元组

rotate a quadruple in an array

给定一个泛型数组 T[] arr。该阵列中的每个四边形都应向左旋转,因此

"a b c d e f" --> "b c d a e f"

如果 Arrays End 不是完整的 Quadrupel,则这些元素不应旋转。

我的想法是:

T[] arr2;

int x;

T temp0 = arr[x+0];

T temp1 = arr[x+1];

T temp2 = arr[x+2];

T temp3 = arr[x+3];

arr2[x+3] = temp0;

arr2[x+2] = temp3;

arr2[x+1] = temp2;

arr2[x+0] = temp1;

x += 1;

所以我要切换第一个 Quadrupel 的元素并将它们保存到第二个数组。 但是我该如何实现,一个不完整的四元组不会旋转,它会在数组的末尾停止?

使用arr.length。在每次赋值时,检查数组的长度是否小于您当前的值。

执行以下操作来处理每个四边形。请注意,我的代码假定您正确定义了 arr 和 arr2;

如果您希望结果在新数组中 arr2

for(int i = 3; i < arr.length; i += 4) // i is pointing at the end of each quadruple, so it will never show an incomplete one
{
    arr2[i-3] = arr[i-2];
    arr2[i-2] = arr[i-1];
    arr2[i-1] = arr[i];
    arr2[i] = arr[i-3];
}

int nbRemainingElements = arr.length % 4;
for(int i = 0; i < nbRemainingElements; ++i)
{
    int index = arr.length - i - 1;
    arr2[index] = arr[index];
}

这是如果你想修改arr而不实例化另一个数组

for(int i = 3; i < arr.length; i += 4) // i is pointing at the end of each quadruple, so it will never show an incomplete one
{
    T firstQuadElement = arr[i-3];
    arr[i-3] = arr[i-2];
    arr[i-2] = arr[i-1];
    arr[i-1] = arr[i];
    arr[i] = firstQuadElement;
}

顺便说一下,如果你想要两个不同的数组,一个解决方案也可以是使用 array.copy 复制 arr 然后应用解决方案 2

你需要把你的代码放在一个循环中(你可能在你的问题中错过了) 请关注:

  1. 尽早完成循环,不要包括最后一个未完成的 Quadrupel(因此限制 length-3 也可以防止越界异常,因为如果只剩下 3 个项目,则检查 Quadrupel 是没有意义的。
  2. 只复制数组的剩余部分as-is

示例代码如下:

int x = 0;

while(x < arr.length - 3) {
    arr2[x+3] = arr[x+0];
    arr2[x+2] = arr[x+3];
    arr2[x+1] = arr[x+2];
    arr2[x+0] = arr[x+1];
    x +=4;
}

while(x < arr.length) {
    arr2[x] = arr[x];
    x++;
}