题目中要求翻转一个数组,注意题目给出的k可能大于数组的长度,所以首先要进行一个预处理,就是k = k % nums.length。解决了这个问题之后,我们可以来考虑翻转的问题,仔细观察后发现,可以用三次翻转数组来解决问题:首先将整个数组反转,接着翻转前k个元素,最后翻转k到第nums.length个元素,这样就可以实现题目中要求的翻转。
注意这种方法不仅仅适用于数组,还可以用同样的思路翻转链表,但是reverse函数要重新写,整个代码如下:
public class Solution {
public void rotate(int[] nums, int k) {
if(nums == null || nums.length == 0) return;
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
private void reverse(int[] nums, int start, int end){
while(start < end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
知识点:
1. 当题目中要求移动/翻转数组/链表k个位置的时候,要多多考虑k大于数组/链表长度的情况,这时候使用k % length即可