是否存在在圆形的int数组上执行左移的现有方法?
具体来说,给定一个包含4个项{1,2,3,4}
且移位量为2的数组,我想要一个方法将前两个字母移动到数组的后面,使它看起来像这样:{{1 }}
此算法是否可以将圆形数组移动一个?
{3,4,1,2}
答案 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
:
tempNumbers
n
到最后一个元素的每个元素,请将其n
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;
}