有人可以告诉如何修复此代码,而不是将数组向右移动,如何让它向左移动?有人可以向我解释一下吗
public class Test {
public static void main(String[] args) {
int[] b = {10, 20, 30, 40, 50, 60};
System.out.println("\n///// Rotate Left k cell example \n////");
b = copyArray(a, a.length);
b = rotateLeft(b,4); //assuming k = 4
printArray(b); // This Should Print: { 50, 60, 10, 20, 30, 40 };
}
// Rotates all the elements of the source array to the right by 'k' positions
// Returns the updated array
public static int[] rotateLeft(int[] source, int k) {
int[] arr = copyArray(source,source.length); //copies all source to a new array
int[] temp = new int[arr.length];
for (int i = 0; i < arr.length; i++){
temp[(i + k) % arr.length] = arr[i];
}
for (int i = 0; i < arr.length; i++){
arr[i] = temp[i];
}
return arr;
}
}
因此,此代码将元素旋转到右侧。我应该如何修改它以使其旋转到左侧?
输出我得到:
{30,40,50,60,10,20}
但我想要的输出是:
{50,60,10,20,30,40}
答案 0 :(得分:4)
我认为您可以更改用于填充temp
数组的分配逻辑。改变这一行:
temp[(i + k) % arr.length] = arr[i];
到此:
temp[i] = arr[(i + k) % arr.length];
此处的逻辑是ith
中的temp[]
条目将等于k
中前面的arr[]
条目。换句话说,temp[]
将包含k
向左移动的原始元素。请注意,您仍然需要mod操作以确保索引包装数组的大小。
完整代码:
public static int [] rotateLeft(int [] source, int k){
int arr[] = copyArray(source, source.length);
int[] temp = new int[arr.length];
for (int i=0; i<arr.length; i++) {
temp[i] = arr[(i + k) % arr.length];
}
for (int i=0; i<arr.length; i++) {
arr[i] = temp[i];
}
return arr;
}
答案 1 :(得分:1)
基本上是129.96 KB
而不是(i - k)
。最重要的是,删除(i + k)
调用和第二个循环。而且因为java中的copyArray
运算符与它的行为相同,所以在实际%
之前,您必须将source.length
添加到(i - k)
:
%
对外输出
50
60个
10个
20个
30个
40