题目描述:
给定一个整数数组
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]
方法一:重新插入法
通过观察,我们可以先创建一个新数组,将原数组的元素轮转k位后放入新数组对应的位置,将所有元组放完后,再将新数组的元素覆盖给原数组即可,但是如果k很大,我们就要轮转好多次,所以我们可以取模,轮转最少次数。
编辑
代码实现:
public void rotate(int[] nums, int k) { int n = nums.length; int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[(i+k)%n] = nums[i]; } for (int i = 0; i < n; i++) { nums[i] = arr[i]; } }
方法二:反转数组法
此方法是解决这类问题常用的一种方法,比较节省空间,不用创建新数组,将数组反转三次,即可完成数组轮转。
编辑
代码实现:
publicvoidrotate1(int[] nums, intk) { intn=k%nums.length; reversal(nums,0,nums.length-1); reversal(nums,0,n-1); reversal(nums,n,nums.length-1); } publicstaticvoidreversal(int[] arr,intl,intr){ while (l<r){ inttemp=arr[l]; arr[l] =arr[r]; arr[r] =temp; l++; r--; } }