算法思路:
实现右移K位
例如12345678
1、逆序数组子序列78 数组形式变为12345687
2、逆序数组子序列123456 数组形式变为 65432187
3、全部逆序 数组形式变为78123456
实现逆序的方法:第一位与倒数第一位交换位置
第二位与倒数第二位交换位置
....................
代码实现:
package JBArray;
/**
* 把一个数组循环右移K位
* 时间复杂度 O(n)
* @author Dan
*
*/
public class RightMoveKInArray {
/**
* 数组反转
* @param a
* @param b
* @param e
*/
public static void reverse(int a[], int b, int e){
for(;b<e;b++,e--){
int temp = a[e];
a[e]=a[b];
a[b]=temp;
}
}
/**
* 实现右移K位
* 例如12345678
* 1、逆序数组子序列78 数组形式变为12345687
* 2、逆序数组子序列123456 数组形式变为 65432187
* 3、全部逆序 数组形式变为78123456
* @param a
* @param k
*/
public static void shift_k(int[] a, int k ){
int n = a.length;
k = k%n;//为了防止k比n大,右移k位跟右移k%n位的结果是一样的
reverse(a, n-k, n-1);
reverse(a, 0, n-k-1);
reverse(a, 0, n-1);
}
public static void main(String[] args) {
int array[]={1,2,3,4,5,6,7,8};
shift_k(array, 2);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}