这是我昨天做的一道CVTE在线测评编程题,原题的意思是”将有n个整数的一维数组R循环右移p个位置”,例如”1234567”,循环右移3位后变为”5671234”,由于当时不能用编译器,而且一老有红色的底线提醒,导致我当时也不知道写出来的是不是正确的,今天在MyEclipse下又写了一次,代码如下:
public class MOVE_K {
public static void main(String[] args) {
int []arr = new int[]{1, 2, 3, 4, 5, 6, 7};
//left_move_k(arr, arr.length, 3);//4 5 6 7 1 2 3
right_move_k(arr, arr.length, 3);// 5 6 7 1 2 3 4
output(arr);
}
/**
* 循环左移k位
* @param arr
* @param length 数组长度,当然JAVA中是可以不给的
* @param k 移动的位数
*/
public static void left_move_k(int[] arr, int length, int k){
k %= length; // 保证循环
reverse(arr, 0, k-1);
reverse(arr, k, length-1);
reverse(arr, 0, length-1);
}
public static void right_move_k(int[] arr, int length, int k){
k %= length;
reverse(arr, 0, length-k-1);
reverse(arr, length-k, length-1);
reverse(arr, 0, length-1);
}
/**
* 逆置数组中从start到end的这一部分
* @param arr
* @param start
* @param end
*/
public static void reverse(int[] arr, int start, int end){
int k = (end + start) / 2;
for (;start <= k; start++, end--){
swap(arr, start, end);
}
}
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void output(int[] arr){
for (int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}
以”1234567”, k=3为例分析(同样的,我也是现在word上画的图):
1. 循环左移动
2 . 循环右移动
注意:左移动的K是从低位开始的k个下标,右移动是从高位开始的k个下标
本质分析:以循环左移为例
问题的本质是把数组ab转换成ba(a代表数组的前k个元素,b代表剩下的n-k个元素)