暴力旋转 k 次
public void rotate(int[] nums, int k) {
int temp, previous;
for (int i = 0; i < k; i++) {
previous = nums[nums.length - 1]; //每次取出最后一个元素
for (int j = 0; j < nums.length; j++) {
temp = nums[j];
nums[j] = previous;
previous = temp;
}
}
}
使用额外的数组
public void rotate(int[] nums, int k) {
int[] a = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i]; //在 a 数组里面记录了旋转后的数字
}
for (int i = 0; i < nums.length; i++) { //把 a 数组的数据复制回原数组
nums[i] = a[i];
}
}
使用反转(还有例题如 字符转翻转)
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1); //全部翻转
reverse(nums, 0, k - 1); // 前 k 个翻转
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;
}
}
环状替换
public void rotate(int[] nums, int k) {
k = k % nums.length;
int count = 0;
for (int start = 0; count < nums.length; start++) { //
int current = start;
int prev = nums[start];
do {
int next = (current + k) % nums.length;
int temp = nums[next];
nums[next] = prev;
prev = temp;
current = next;
count++;
} while (start != current);
}
}
LeetCode 下的评论:
把元素看做同学,把下标看做座位,大家换座位。第一个同学离开座位去第k+1个座位,第k+1个座位的同学被挤出去了,他就去坐他后k个座位,如此反复。但是会出现一种情况,就是其中一个同学被挤开之后,坐到了第一个同学的位置(空位置,没人被挤出来),但是此时还有人没有调换位置,这样就顺着让第二个同学换位置。 那么什么时候就可以保证每个同学都换完了呢?n个同学,换n次,所以用一个count来计数即可。