Java数组循环移位核心是三次反转法(O(1)空间)或取模索引法(灵活方向);左移k位:先反前k、再反后n−k、最后反全部;取模法中右移用(i−k+n)%n防负索引,需预处理k%=n并处理边界。

Java 中实现数组元素的循环左移或右移,核心思路是“三次反转”或“取模位移”,不依赖额外空间也能高效完成。关键在于理解循环移位的本质:把数组看成首尾相连的环,移动只是改变起始读取位置。
用三次反转法实现循环左移
这是最经典、原地操作且时间复杂度 O(n)、空间复杂度 O(1) 的方法。以左移 k 位为例,步骤为:
- 反转前 k 个元素
- 反转剩余 n−k 个元素
- 反转整个数组
例如数组 [1,2,3,4,5] 左移 2 位 → [3,4,5,1,2]:
① 反转 [0..1] → [2,1,3,4,5]
② 反转 [2..4] → [2,1,5,4,3]
③ 反转全部 → [3,4,5,1,2]
用取模索引实现任意方向移动
适合需要灵活支持左移/右移、或需保留原数组的场景。新建数组,按新位置赋值:
- 左移 k 位:新数组索引 i 对应原数组索引 (i + k) % n
- 右移 k 位:新数组索引 i 对应原数组索引 (i - k + n) % n
注意 k 可能大于数组长度,先做 k %= n 避免冗余循环。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
封装成通用工具方法
实际开发中建议封装为静态方法,自动处理边界和方向:
<font color="#888">public static void rotateLeft(int[] arr, int k) {<br> if (arr == null || arr.length == 0) return;<br> int n = arr.length;<br> k = k % n;<br> if (k == 0) return;<br> reverse(arr, 0, k - 1);<br> reverse(arr, k, n - 1);<br> reverse(arr, 0, n - 1);<br>}<br><br>private static void reverse(int[] arr, int start, int end) {<br> while (start < end) {<br> int temp = arr[start];<br> arr[start] = arr[end];<br> arr[end] = temp;<br> start++; end--;<br> }<br>}</font>注意事项与常见陷阱
容易出错的地方集中在索引计算和边界处理:
- k 为负数时,可统一转为等效正向移动(如左移 -2 等价于右移 2)
- 空数组或单元素数组无需操作,提前返回
- 使用取模法时,(i - k) % n 在 Java 中可能为负,应写成 (i - k + n) % n
- 若要求返回新数组而非修改原数组,记得 clone 或新建数组

















