一. 题目

二. 思路

1. 数组翻转

2. 环状替换

三. 代码

1. 数组翻转

class Solution
{
    //为了使得空间为O(1),不能用API
    void reverse(int[] nums, int l, int r)
    {
        while (l < r)
        {
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            ++l;
            --r;
        }
    }

    public void rotate(int[] nums, int k)
    {
        int n = nums.length;
        k %= n;//轮转n后,就是原数组,所以实际轮转是k%n
        reverse(nums, 0, n - 1);//翻转整个数组
        reverse(nums, 0, k - 1);//翻转前半段
        reverse(nums, k, n - 1);//翻转后半段
    }
}

2. 环状替换

class Solution
{
    public void rotate(int[] nums, int k)
    {
        int n = nums.length;
        k %= n;//轮转n后,就是原数组,所以实际轮转是k%n
        if (k == 0) return;

        // count用于计数,确保每个位置都被修改
        for (int startId = 0, count = 0, curId = startId, curNumber = nums[curId]; count < n; ++count)
        {
            int nextNumber = nums[(curId + k) % n];// 作为临时变量,存储被修改之前的内容
            nums[(curId + k) % n] = curNumber;// 交换
            curNumber = nextNumber;
            curId = (curId + k) % n;
            // 判断并更新参数
            if (curId == startId)//若k>1, 新起点就是前面跳过的点
            {
                ++startId;
                // 此处要更新新的curId和curNumber
                curId = startId;
                curNumber = nums[curId];
            }
        }
    }
}