Java 数组循环右移k位

【思路一】最基本解法:内层循环,循环右移1位,外层循环执行K次。由于前一位覆盖后一位,所以内存循环从后向前移动

【思路二】
翻转方法,三次翻转。[1,2,3,4,5],k=2
第一次倒置整个数组:[5,4,3,2,1]
第二次对左边k个元素倒置:[4,5,3,2,1]
第三次对右边length-k个元素倒置:[4,5,1,2,3]

import java.util.Arrays;

/**
 * 数组循环右移K位
 */
public class movek {
    //最基本解法:内层循环,循环右移1位,外层循环执行K次
    //由于前一位覆盖后一位,所以内存循环从后向前移动
    public void move1(int[] arr,int k){
        int length=arr.length;
        int newk=k%length;
        for(int i=0;i<newk;i++){
            int tmp=arr[length-1];
            for(int j=length-2;j>=0;j--){
                arr[j+1]=arr[j];
            }
            arr[0]=tmp;
        }
    }
    //翻转方法,三次翻转。[1,2,3,4,5],k=2
    //第一次倒置整个数组:[5,4,3,2,1]
    //第二次对左边k个元素倒置:[4,5,3,2,1]
    //第三次对右边length-k个元素倒置:[4,5,1,2,3]
    public void move2(int[] arr,int k){
        k=k%arr.length;
        reverse(arr,1,arr.length);
        reverse(arr,1,k);
        reverse(arr,k+1,arr.length);

    }
    //交换数组i和j位置的元素
    public static void swap ( int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    //倒置数组从start到end位
    public void reverse(int[] arr,int start,int end){
        int i=start;
        int j=end;
        while(i<j){
            swap(arr,i-1,j-1);
            i++;
            j--;
        }
    }

    public static void main(String args[]){
        movek testmovek=new movek();
        int[] arr={1,2,3,4,5};
        //testmovek.reverse(arr,1,5);
        testmovek.move2(arr,6);
        System.out.println(Arrays.toString(arr));
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值