将数组中的数循环移动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个元素)
这里写图片描述

你可能感兴趣的:(数组循环移动)