189. 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:暴力破解,每一步先用一个临时变量,存储最后一位,然后再循环覆盖后一位,最后将最后一位放到最前面即可。
class Solution {
public void rotate(int[] nums, int k) {
for(int i=0;i<k;i++)
{
int temp=nums[nums.length-1];
for(int j=nums.length-1;j>0;j--)
{
nums[j]=nums[j-1];
}
nums[0]=temp;
}
}
}
方法二:使用额外数组
class Solution {
public void rotate(int[] nums, int k) {
int[] res=new int[nums.length];
for(int i=0;i<nums.length;i++)
{
res[(i+k)%nums.length]=nums[i];
}
for(int j=0;j<res.length;j++)
{
nums[j]=res[j];
}
}
}
方法三:三次旋转,第一次将整个数组旋转,第二次将前k个元素旋转,第三次将后n-k个数旋转
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 void reverse(int[] nums,int start,int end)
{
while(start<end)
{
int temp=nums[start];
nums[start]=nums[end];
nums[end]=temp;
start++;
end--;
}
}
}