普通数组

轮转数组

中等#189Java时间 O(n)空间 O(1)

题目要做什么

将数组原地向右轮转 k 步。k 是非负整数,超出数组长度时取模。

题目示例输入nums = [1,2,3,4,5,6,7], k = 3
题目示例输出[5,6,7,1,2,3,4]

01 为什么这样做

把数组分成前段 A 和后段 B,目标是 BA。整体翻转得到 reverse(B)reverse(A),再分别翻转两段,就得到 BA。

始终成立的条件

每次翻转时,区间外的元素已经固定;左右指针向内交换对称元素。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public void rotate(int[] nums, int k) {3        if (nums.length == 0) return;4        k %= nums.length;5        reverse(nums, 0, nums.length - 1);6        reverse(nums, 0, k - 1);7        reverse(nums, k, nums.length - 1);8    }9    private void reverse(int[] nums, int left, int right) {10        while (left < right) {11            int temp = nums[left];12            nums[left] = nums[right];13            nums[right] = temp;14            left++; right--;15        }16    }17}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索