LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
📅 2026/8/3 6:25:35
👁️ 次浏览
在数组题中“轮转数组”是一道很典型的题。它的代码并不长但同时考查了数组下标、空间复杂度、边界处理以及能否从结果反推出操作过程。这篇文章用 Java 解决 LeetCode 189「轮转数组」重点讲清楚一个看起来有些巧妙的方法为什么只需要三次反转就能把数组向右轮转k个位置。一、题目描述给定一个整数数组nums将数组中的元素向右轮转k个位置要求直接修改原数组。例如输入nums [1,2,3,4,5,6,7], k 3 输出[5,6,7,1,2,3,4]向右轮转 3 个位置可以理解为把数组末尾的 3 个元素[5,6,7]移到数组开头其余元素[1,2,3,4]整体向后移动。二、最容易想到的做法使用额外数组原数组下标为i的元素轮转后会出现在(i k) % n因此可以创建一个长度相同的新数组把每个元素放入新位置再复制回原数组public void rotate(int[] nums, int k) { int n nums.length; k % n; int[] temp new int[n]; for (int i 0; i n; i) { temp[(i k) % n] nums[i]; } System.arraycopy(temp, 0, nums, 0, n); }这个方法很直观时间复杂度为O(n)但需要O(n)的额外空间。如果面试官进一步要求空间复杂度为O(1)就需要考虑原地操作。三、最优解三次反转仍然以数组为例[1, 2, 3, 4, 5, 6, 7]向右轮转 3 位后希望得到[5, 6, 7, 1, 2, 3, 4]可以把原数组分成两部分A [1, 2, 3, 4] B [5, 6, 7]轮转的目标本质上就是把A B变成B A。具体分三步。第一步反转整个数组[1, 2, 3, 4, 5, 6, 7] ↓ [7, 6, 5, 4, 3, 2, 1]此时两部分的位置已经交换但每个部分内部的顺序也被反转了。可以表示为reverse(B) reverse(A)第二步反转前 k 个元素前 3 个元素是[7,6,5]将其反转[7, 6, 5, 4, 3, 2, 1] ↓ [5, 6, 7, 4, 3, 2, 1]这样原数组末尾的B已经恢复成正确顺序。第三步反转剩余元素再把下标k到n - 1的部分[4,3,2,1]反转[5, 6, 7, 4, 3, 2, 1] ↓ [5, 6, 7, 1, 2, 3, 4]最终得到目标结果。整个过程可以概括为整体反转 → 反转前 k 个元素 → 反转后 n-k 个元素四、为什么三次反转一定成立假设原数组由两部分组成A B其中B是需要移到前面的最后k个元素。第一次整体反转后得到reverse(B) reverse(A)然后分别反转前后两部分B A这正是向右轮转后的结果。因此三次反转不是只对某个示例有效而是对任意数组都成立。五、完整 Java 代码class Solution { public void rotate(int[] nums, int k) { int n nums.length; k % n; // 1. 反转整个数组 reverse(nums, 0, n - 1); // 2. 反转前 k 个元素 reverse(nums, 0, k - 1); // 3. 反转剩余元素 reverse(nums, k, n - 1); } private void reverse(int[] nums, int left, int right) { while (left right) { int temp nums[left]; nums[left] nums[right]; nums[right] temp; left; right--; } } }reverse方法使用双指针left从左向右移动right从右向左移动每次交换两个位置的元素直到两个指针相遇。六、为什么必须对 k 取模如果数组长度为 7而k 10向右轮转 10 次和向右轮转 3 次的结果相同10 % 7 3因为每轮转n次数组都会恢复原状所以真正有效的轮转次数是k % nums.length;这一步还能避免k大于数组长度时后续反转区间越界。当k 0时第二次反转调用的区间是[0, -1]。由于reverse中的条件是left right循环不会执行代码仍然能够正确运行。七、复杂度分析虽然进行了三次反转但每个元素只会被交换有限次因此时间复杂度O(n)空间复杂度O(1)它没有创建与数组长度相关的辅助空间满足原地修改的要求。八、常见错误1. 忘记对 k 取模当k nums.length时反转区间可能越界。进入反转逻辑前应先执行k % n。2. 反转顺序写错向右轮转的常见写法是整体 → 前 k 个 → 后 n-k 个不要把k误写成n - k。可以始终记住向右轮转后原数组最后的k个元素要出现在最前面。3. 逐个移动导致超时如果每轮转一次就把整个数组移动一遍那么时间复杂度是O(n × k)。当数组和k都很大时这种方法容易超时。4. 只修改了局部变量题目要求原地修改nums不能只让一个新数组变量指向结果而不复制回去。三次反转直接操作原数组不存在这个问题。
1. 家电清洗,真的只是“擦擦灰”吗?很多萍乡家庭觉得家电清洗就是表面擦一擦,花几十块买个清洗剂自己就能搞定。但真相是,空调、洗衣机、油烟机内部积累的细菌、霉菌和油垢,普通擦拭根本清不掉。一台使用三年的洗衣机&…
📅 2026/8/3 6:25:35
引言深度学习模型规模与计算需求的快速增长数据结构优化与存储调度对模型性能的影响研究背景与意义数据结构优化在深度学习中的重要性常见数据结构(张量、稀疏矩阵、图结构)的存储需求数据结构对计算效率的影响(内存访问、计算并行性…
📅 2026/8/3 6:25:35
1. 项目概述:为什么选择云GPU跑Hashcat?如果你对无线网络安全测试或者密码恢复领域有所涉猎,大概率听说过Hashcat——这个被誉为“世界上最快、最先进的密码恢复工具”。它支持数百种哈希算法,从古老的MD5到现代的WPA/WPA2握手包&…
📅 2026/8/3 6:25:35
1. 项目概述:为什么渲染管线是Unity开发者的必修课? 如果你在Unity里做过项目,尤其是涉及到稍微复杂一点的视觉效果时,大概率会听到“渲染管线”这个词。它听起来很底层,像是引擎内部的黑盒,很多开发者一开…
📅 2026/8/3 9:36:57
你打开游戏,准备在王者荣耀国际服里放松一下。选英雄阶段,你看到队友锁定了亚瑟,心里一紧——这个英雄在国内服,除了新手期,几乎已经消失在主流视野之外。你安慰自己,也许国际服环境不同,或者这…
📅 2026/8/3 9:35:57
如何快速掌握猫抓浏览器扩展:5个专业技巧完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
猫抓(Cat-Catchÿ…
📅 2026/8/3 9:35:57
如何在3分钟内解锁macOS虚拟机:VMware跨平台虚拟化完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker
想要在Windows或Linux电脑上运行macOS虚拟机,却发现VMware中根本没有…
📅 2026/8/3 9:35:57
1. 项目缘起:从“人眼”到“AI眼”的监控升级 几年前,我在参与一个智慧社区项目时,遇到了一个非常具体且棘手的需求:如何在出入口、大堂等公共区域,实时、自动地检测人员是否规范佩戴口罩。当时,主流的方案…
📅 2026/8/3 9:35:57
3分钟解锁音乐自由:ncmdump解密工具终极解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump
你是否曾经遇到过这样的困扰?从网易云音乐精心下载的歌曲,只能在官方客户端播放,无法在…
📅 2026/8/3 9:35:57
PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…
📅 2026/8/3 0:00:19
前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…
📅 2026/8/3 0:00:19
完整指南:如何让2008-2017年老款Mac运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher
还在为手中的老款Mac无法升级到最新系统而烦…
📅 2026/8/3 0:00:19
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/3 1:24:09
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/3 1:24:09
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/3 1:24:09
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/3 1:24:08
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/3 1:24:08
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/3 1:24:08