力扣:旋转数组

在这里插入图片描述


需求

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

在这里插入图片描述


版本1

本办法先定义一个临时数组, 将 nums 的值拷贝进去

//  定义一个临时数组
int[] temp = new int[length];
//  将 nums 里的元素先放在临时数组里
for( int i = 0; i < length; i++ ){
    temp[i] = nums[i];
}

然后给数组重新赋值即可:

//  给数组赋新的值
for( int i = 0; i < length; i++ ){
    nums[i] = temp[(length - k + i) % length];
}

代码就形成了:

public void rotate(int[] nums, int k) {
    int length = nums.length;
    //  定义一个临时数组
    int[] temp = new int[length];
    //  将 nums 里的元素先放在临时数组里
    for( int i = 0; i < length; i++ ){
        temp[i] = nums[i];
    }
    //  给数组赋新的值
    for( int i = 0; i < length; i++ ){
        nums[i] = temp[(length - k + i) % length];
    }
}

执行:
在这里插入图片描述

太棒了!!!

火眼金睛分析一下:
在这里插入图片描述

嘿嘿 原因一下就找到了, 改代码

在这里插入图片描述

public void rotate(int[] nums, int k) {
    int length = nums.length;
    k = k % length;
    //  定义一个临时数组
    int[] temp = new int[length];
    //  将 nums 里的元素先放在临时数组里
    for( int i = 0; i < length; i++ ){
        temp[i] = nums[i];
    }
    //  给数组赋新的值
    for( int i = 0; i < length; i++ ){
        nums[i] = temp[(length - k + i) % length];
    }
}

执行:
在这里插入图片描述


版本2

观察提醒信息: 0 <= k <= 105 k 是有可能为 0 的, k 为 0 我还旋转个啥啊. 还有就是 如果数组长度是1, 那我也不用旋转了啊. 优化一下:

在这里插入图片描述

执行:
在这里插入图片描述


版本3

再看进阶提醒: 事情变得似乎有趣了起来~~~

在这里插入图片描述

What are you talking about ? , 能写出来就已经让我大脑痉挛了, 还让我原地解决这个问题???

想不出来, 直接抄答案吧

public void rotate(int[] nums, int k) {
    int length = nums.length;
    if( k == 0 || length == 1 ){
        return;
    }
    k = k % length;
    rotate(nums, 0, nums.length - 1);
    rotate(nums, 0, k - 1);
    rotate(nums, k, nums.length - 1);
}

private void rotate(int[] nums, int start, int end) {
    while (start < end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start += 1;
        end -= 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值