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]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
分析:
本题相当于每次把数组中所有的元素向后移动一个单位,然后原来数组的最后一个数据移动到第一位。
举个例子:1,2,3,4,5,6,7 k=3
代码如下:
class Solution {
public void rotate(int[] array, int k) {
int length = array.length;
// 假设移动的位数是newk,那么无论是向右还是向左移动newk+n*length个位置之后,移动到还是原来的位置
int newk = k % length;
int temp = 0;
for(int i = 0; i < newk; i++) {
// 这个temp保存的是这个数组的一个元素
temp = array[length - 1];
for(int j = length - 2; j >= 0; j--) {
// 让后一个元素等于前面的元素,相当于后面的元素是被前面的元素覆盖了
array[j+1] = array[j];
}
// 第一个元素在每一个循环结束之后就要把之前的临时变量填充后进去
// 因为临时变量保存的是每一次的最后一个位置的元素
array[0] = temp;
}
}
}
运行结果:
用例1:
用例2: