描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
例子:
输入:
[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]
解法一:
循环k次,每次先保存数组中的最后一个数,然后将整个数组往后移动一位,最后在将最后一个数赋值给第一个数。
public static void rotate(int[] nums, int k) {
for(int i = 1; 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;
}
}
解法二:
既然是旋转数组,那我们要将数组旋转起来,对于[1,2,3,4,5,6,7] ,如果我们将整个数据进行旋转的话,有如下结果:
[7,6,5,4,3,2,1]
假如k=3; 这个位置对于元素4
然后对4的左边和右边包含4各自再进行一次旋转,得到如下结果:
[5,6,7,1,2,3,4]
因此我们需要根据次数指定旋转的中心位置,然后进行三次旋转即可:
public static void rotate1(int[] nums, int k) {
k %= nums.length;
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
private static void reverse(int[] nums, int start, int end){
while(start < end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}