- 1.题目
- 2.解题思路
- 使用一个变量temp暂存
- 使用额外的数组
- 翻转数组
- 3.Java代码
1.题目
给定一个数组,将数组中的元素向右移动 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 <= 2 * 104
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
将数组中最后一个元素暂存在一个变量temp中,数组中其余元素均向后移1,此时数组中num[0]空闲,使其等于缓存在temp中的值。有题目得该数组中的元素向右移k个位置,因此此过程重复k次。
使用额外的数组数组移动过程中,若nums[i]向右移k个位置,则移动结束后,它应该在nums[(i+k)%nums.length]。使用额外的数组,要让新数组长度与原数组相等且为空,将nums[i]位置的元素放在新数组下标为 (i+k)%nums.length 的位置。一系列操作之后,新数组便是题目所需要的结果。
翻转数组由题意可知,当数组旋转之后,后面的一部分元素便会到前面。此时我们可以进行数组翻转(其实就是把数组逆序排列一边),又由于题中说元素向右移动k个位置,则使第一次翻转后的数组的前k个元素为一组,其余后面的元素为一组,分别再进行反转,便可得到所求结果
eg.
- 最容易想到的一种,但是会超出时间限制。
class Solution {
public void rotate(int[] nums, int k) {
while(k>0){
int temp=nums[nums.length-1];
for(int i=nums.length-1;i>0;i--){
nums[i]=nums[i-1];
}
nums[0]=temp;
k--;
}
}
}
- 使用额外的数组
class Solution {
public void rotate(int[] nums, int k) {
int length=nums.length;
int[] arr=new int[length]; //使用与原数组等长的一个额外的数组
for(int i=0;i
- 翻转数组
class Solution {
public void rotate(int[] nums, int k) {
k%=nums.length;
re(nums,0,nums.length-1); //先将整个数组进行翻转
re(nums,0,k-1); //前k个元素进行翻转
re(nums,k,nums.length-1); //后面其余元素再进行一次翻转
}
public void re(int[] nums,int left,int right){ //翻转的过程
while(left
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-array 


