普通解法有很多种,这里着重介绍技巧解法,题目的的目的是为了把数组最后k%len个元素放到前面去,所以我们可以先总体上翻转数组,这样,最后k个元素就放到了最前面k个位置,只不过顺序相反而已,所以我们可以依次翻转前K个和后面的n-k个元素。代码如下(ps:找实习真滴难)
普通解法:
class Solution {
public void rotate(int[] nums, int k) {
int len = nums.length;
int[] next = new int[len];
for(int i=0;i<len;i++){
int nextIndex = (i+k)%len;
next[i] = nextIndex;
}
int[] res = new int[len];
for(int i=0;i<len;i++){
res[next[i]] = nums[i];
}
for(int i=0;i<len;i++){
nums[i] = res[i];
}
return;
}
}
技巧解法:
class Solution {
public void rotate(int[] nums, int k) {
// 1 2 3 4 5 6 7 k=3
// x x x 1 2 3 4 5 6 7
// 5 6 7 1 2 3 4
// 所以我们可以将数组先翻转
// 7 6 5 4 3 2 1
// 然后翻转前K个,和后面的n-k个
// 5 6 7 | 4 3 2 1
// 5 6 7 | 1 2 3 4
int n = nums.length;
k = k % n;
reverse(nums, 0, n-1);
reverse(nums, 0, k-1);
reverse(nums, k, n-1);
}
public void reverse(int[] arr, int i, int j){
// [i, j];
while(i<j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}
}
}