旋转数组中的四元组
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
你需要把你的代码放在一个循环中(你可能在你的问题中错过了)
请关注:
- 尽早完成循环,不要包括最后一个未完成的 Quadrupel(因此限制
length-3
也可以防止越界异常,因为如果只剩下 3 个项目,则检查 Quadrupel 是没有意义的。
- 只复制数组的剩余部分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++;
}
给定一个泛型数组 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
你需要把你的代码放在一个循环中(你可能在你的问题中错过了) 请关注:
- 尽早完成循环,不要包括最后一个未完成的 Quadrupel(因此限制
length-3
也可以防止越界异常,因为如果只剩下 3 个项目,则检查 Quadrupel 是没有意义的。 - 只复制数组的剩余部分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++;
}