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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值