將陣列中的數迴圈移動k位
阿新 • • 發佈:2019-02-17
這是我昨天做的一道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個元素)