題目中要求翻轉一個數組,注意題目給出的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即可