Medium
Related Topics: Array / Math / Two Pointers
LeetCode Source
這裡初始化 l 是 nums 的長度
蠻直觀的解法,直接在 l - k 的地方把 nums 切開,之後將後半部放到前面
不過要注意的一點是,有時候 k 會大於 l,所以記得 k = k % l
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        l = len(nums)
        k = k % l
        nums[:] = nums[l-k:] + nums[:l-k]
        return
Python 解法有點簡單,所以自己建議是多用其他語言解題
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int l = nums.size();
        k = k % l;
        vector<int> temp(nums.begin() + l - k, nums.end());
        temp.insert(temp.end(), nums.begin(), nums.begin() + l - k);
        nums = temp;
    }
};
這解法不是 in-place 解,我在這多宣告一個 temp 來放 nums 的後半部
後面用 insert 將原先 nums 的前半部放在 temp 的後面,最後 temp 取代 nums
有鑑於 C++ 解法並非 in-place,所以有另一種解法,用 reverse()
做法是 reverse() 三次,後面兩步可以交換順序執行
nums
k 個l - k 個class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums.reverse()
        nums[k:] = reversed(nums[k:])
        nums[:k] = reversed(nums[:k])
nums.reverse() 反轉整個 list
而透過 reversed(nums[k:]) 反轉 index k 到 l 的 listreversed(nums[:k]) 反轉 index 0 到 k - 1 的 list
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin() + k, nums.end());
    }
};