你如何在一个圆形的int数组上执行左移?

时间:2010-12-15 19:38:07

标签: java methods int

是否存在在圆形的int数组上执行左移的现有方法?

具体来说,给定一个包含4个项{1,2,3,4}且移位量为2的数组,我想要一个方法将前两个字母移动到数组的后面,使它看起来像这样:{{1 }}

此算法是否可以将圆形数组移动一个?

{3,4,1,2}

7 个答案:

答案 0 :(得分:5)

这是我的理由......(这里是一个ideone.com demo

import java.util.Arrays;

public class Test {

    public static void circularShiftLeft(int[] arr) {
        if (arr.length == 0)
            return;

        int first = arr[0];
        System.arraycopy(arr, 1, arr, 0, arr.length - 1);
        arr[arr.length - 1] = first;
    }

    public static void main(String[] arg) {
        int[] arr = { 1, 2, 3, 4 };
        System.out.println(Arrays.toString(arr));
        circularShiftLeft(arr);
        System.out.println(Arrays.toString(arr));
    }
}

答案 1 :(得分:4)

我把这个作为面试问题。一个简单到位(有点直观)O(2n)旋转m的解决方案是取数组,反转它,然后反转[0,m]和(m,n)子阵列。我的解决方案虽然不那么明显,就位和O(n)。基本上你的想法是你在一个项目上向前旋转一个项目,最终你将通过所有元素。如果数组是距离的倍数,那就是GCD进来。以下将向右旋转,向左旋转留给读者作为练习:

public static void main(String[] args) {
    int[] f = {0, 4, 8, 2, 6, 7, 4, 5, 3};
    System.out.println(Arrays.toString(f));
    rotate(f, 3);
    System.out.println(Arrays.toString(f));
}

public static void rotate(int[] arr, int dist){
    int tmp, tmp2, gcd = GCD(arr.length, dist);
    for(int off=0;off<gcd;off++){
        tmp = arr[off];
        for(int i=0,idx=off;i<arr.length/gcd;idx=(idx+dist)%arr.length,i++){
            tmp2 = arr[(idx+dist)%arr.length];
            arr[(idx+dist)%arr.length] = tmp;
            tmp = tmp2;
        }
    }
}

public static int GCD(int a, int b) {
   if (b==0) return a;
   return GCD(b,a%b);
}

答案 2 :(得分:0)

假设你要转移n

  1. 复制名为tempNumbers
  2. 的数组中的前n个元素
  3. 对于从n到最后一个元素的每个元素,请将其n
  4. 向左移动
  5. 将元素从tempNumbers复制到原始数组的末尾

答案 3 :(得分:0)

为什么不使用循环(双重)链表?在这种情况下,您只需要更改“开始指针”。

答案 4 :(得分:0)

这是一些伪代码,可以做你想要的。

Array shift(Array a, int shiftLength) {
    Array b;

    for(i = shiftLength; i < a.size(); i++)
        b.add(a.at(i));

    for(i = 0; i < shiftLength; i++)
        b.add(a.at(i));

    return b;
}

答案 5 :(得分:0)

这会将数组向左移一步。

int[] a = new int[] { 1, 2, 3, 4, 5 };
int[] b = new int[a.length];
System.arraycopy(a, 1, b, 0, a.length - 1);
b[a.length - 1] = a[0];
// b = {2,3,4,5,1}
// edit
a = b;

答案 6 :(得分:0)

public static void shift(int[] arr, int offs) {
    // e.g. arr = 1,2,3,4,5,6,7,8,9; offs = 3
    offs %= arr.length;
    offs = offs < 0 ? arr.length + offs : offs;

    if (offs > 0) {
        // reverse whole array (arr = 9,8,7,6,5,4,3,2,1)
        for (int i = 0, j = arr.length - 1; i < j; i++, j--)
            swap(arr, i, j);
        // reverse left part (arr = 7,8,9,6,5,4,3,2,1)
        for (int i = 0, j = offs - 1; i < j; i++, j--)
            swap(arr, i, j);
        // reverse right part (arr = 7,8,9,1,2,3,4,5,6)
        for (int i = offs, j = arr.length - 1; i < j; i++, j--)
            swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}