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

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

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

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

 algShiftByOne(Array) { temp=array[0]; i=1 while(i < Array.length - 1) // Loop from 1 up to array.length == last index { // If there is no exception i assume it copies value from // initial array starting from 1 up to array.length Array[i - 1] = Array[i]; i++; } Array[Array.length]=temp; } 

这是我的进展…(这是一个ideone.com演示 )

 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)); } } 

我把这个作为面试问题。 一个简单到位(有点直观)O(2n)旋转m的解决方案是取数组,反转它,然后反转[0,m]和(m,n)子arrays。我的解决方案,虽然不太明显,就位和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 

假设你要转移n

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

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

这里有一些伪代码可以做你想要的。

 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; } 

这会将数组向左移动一个。

 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; 
 public static void shift(int[] arr, int offs) { // eg 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; }