题目描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
解题思路
1、代码1逻辑:对于数组n,移动k个位置,有k%n个数会移动到数组前面。
语句k %= nums.length,主要是针对移动位置k和数组n相等。
对于数组[1,2,3,4,5,6,7]
第一次反转:开始的索引是0, 结束的索引是6:[7,6,5,4,3,2,1]
第二次反转:开始的索引是0, 结束的索引是2:[5,6,7,4,3,2,1]
第三次反转:开始的索引是3, 结束的索引是6:[5,6,7,1,2,3,4]
代码1
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--;
}
}
}
代码2
class Solution {
public void rotate(int[] nums, int k) {
int len = nums.length;
k = k % len;
int count = 0;
for(int start = 0; count < len; start++){
int cur = start;
int pre = nums[cur];
do{
int next = (cur + k) % len;
int temp = nums[next];
nums[next] = pre;
pre = temp;
cur = next;
count++;
}while(start != cur);
}
}
}