将数组的所有元素向左旋转“k”位置,但我的代码将其移动到右侧

时间:2017-01-29 14:33:04

标签: java arrays

有人可以告诉如何修复此代码,而不是将数组向右移动,如何让它向左移动?有人可以向我解释一下吗

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}

2 个答案:

答案 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