1. 程式人生 > >將陣列中的數迴圈移動k位

將陣列中的數迴圈移動k位

這是我昨天做的一道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個元素)
這裡寫圖片描述