/*
 * 演算法 / Algorithm: 三次反轉 / triple reverse.
 * 1) 整個陣列反轉 / reverse whole array
 * 2) 反轉前 k 個 / reverse first k
 * 3) 反轉後 n-k 個 / reverse last n-k
 * 時間 O(n)、空間 O(1)。Time O(n), space O(1).
 */

// 反轉 nums[l..r]（含兩端）/ reverse nums in range [l, r] inclusive
static void reverseRange(int* nums, int l, int r) {
    while (l < r) {                  // 雙指針未相遇就繼續 / continue while pointers haven't met
        int tmp = nums[l];           // 暫存左端值 / save left value into a temp
        nums[l] = nums[r];           // 把右端值搬到左邊 / move right value to left
        nums[r] = tmp;               // 把暫存的左端值放到右邊 / place saved value on the right
        l++;                         // 左指針向右移 / advance left pointer
        r--;                         // 右指針向左移 / move right pointer leftward
    }
}

// LeetCode 函式簽名：原地修改 nums，不需回傳 / signature: modify nums in place, no return value
void rotate(int* nums, int numsSize, int k) {
    int n = numsSize;                // 用較短的別名 n / shorter alias for length
    if (n <= 1) return;              // 長度 0 或 1 不必旋轉 / nothing to rotate
    k = k % n;                       // 把 k 縮到 [0, n) 避免多餘整圈 / drop full-cycle rotations
    if (k == 0) return;              // 旋轉 0 步等於不動 / k==0 means no change

    reverseRange(nums, 0, n - 1);    // 步驟 1：整個陣列反轉 / step 1: reverse all
    reverseRange(nums, 0, k - 1);    // 步驟 2：反轉前 k 個 / step 2: reverse first k
    reverseRange(nums, k, n - 1);    // 步驟 3：反轉後 n-k 個 / step 3: reverse the rest
}
