力扣 189.轮转数组

题目描述

给定一个整数数组 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

代码实现:

public static void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[((i+k)%n)] = nums[i];
        }
        System.arraycopy(a,0,nums,0,n);
    }

知识点

这里使用方法是传值,但是Arrays.copyOf()实现的是形成一个新数组,因此不能使用copyOf实现数组复制,应该使用 System.arraycopy(a,0,nums,0,n);  四个参数分别是:原数组,原数组的起始下标,目标数组,目标数组的起始下标,要复制多少个元素。

题解2:使用反转数组来实现,首先将整个数组反转,然后将[0,k mod n -1]位置的数组反转,接着将[k mod n , n-1]位置的数组反转,一开始自己写的时候没有考虑到,k>n的情况,实际上题解一写的时候也没有考虑到,题解二实现的时候发现参考答案中有对k>n情况的考虑,因此才意识到需要k mod len

代码实现

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums,0,nums.length-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.length-1);
    }

    public static void reverse(int[] arr,int start,int end){
        int n = arr.length;
        while(start<end){
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            start++;
            end--;
        }
    }
}

知识点:

1、没什么好说的,没遇到过就想不出来还能这样反转来求解·,记住类似题型;

2、数组反转!不要再使用for循环了,虽然时间复杂度一样,但是while双指针看起来优雅。

public static void reverse(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n / 2; i++) {
        // 交换第 i 个元素和第 n - i - 1 个元素
        int temp = arr[i];
        arr[i] = arr[n - i - 1];
        arr[n - i - 1] = temp;
    }
}

3、java传值,对arr的修改就是对arr引用地址内容的修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值