给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

 

你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?                                                           比如:输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

无脑解法:就硬挪,双重循环,内层循环控制从左到右挪动有几个数挪几次,外层循环控制K挪几个位置。

public void arrayMove1(int[] arr, int k) {
        int len = arr.length;
        k = k % len;
        for (int i = 0; i < k; i++) {
            int temp = arr[len - 1];
            for (int j = len - 1; j > 0; j--) {
                arr[j] = arr[j - 1];
            }
            arr[0] = temp;
        }
        System.out.println("数组向后移动K位的结果为:");
        System.out.println(Arrays.toString(arr));
    }

数组翻转法:

先将数组整体翻转,再以k为界,两侧分别翻转。这个解法很巧妙

比如我们定义一个数组arr={1,2,3,4,5,6,7} ,k=3

为了防止数组下标越界 我们把k处理一下:k=k%len

第一个for循环翻转整个数组

第二个for循环翻转k左边的数组

第三个for循环翻转k右边的数组

public void arrayMove2(int[] arr, int k) {
        int len = arr.length;
        k = k % len;
        int temp=0;
        for (int i = 0; i < len / 2; i++) {
            temp = arr[len - 1 - i];
            arr[len-1-i]=arr[i];
            arr[i]=temp;
        }
        for (int i = 0; i < k/2; i++) {
            temp=arr[k-1];
            arr[k-1]=arr[i];
            arr[i]=temp;
        }
        for (int i = k,j=len-1; i<j; i++,j--) {
            temp=arr[j];
            arr[j]=arr[i];
            arr[i]=temp;
        }
        System.out.println("数组向后移动K位的结果为:");
        System.out.println(Arrays.toString(arr));
    }

重复代码太多了 ,我们用一个方法把核心逻辑代码封装一下:

public void arrayMove3(int[] arr, int k) {
        k %= arr.length;
        arrayMoveBasic(arr, 0, arr.length - 1);
        arrayMoveBasic(arr, 0, k - 1);
        arrayMoveBasic(arr, k, arr.length - 1);
    }

    public void arrayMoveBasic(int[] arr, int i, int j) {
        while (i < j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i += 1;
            j -= 1;
        }
    }

噔噔蹬蹬~ 这样就简洁多了。

欢迎斧正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值