java数组循环移位推荐三次反转法,时间复杂度o(n)、空间复杂度o(1),步骤为:先整体反转,再反转前k个,最后反转后n−k个;也可用额外空间复制,直观但需o(n)空间;左移可统一转为右移处理,k需归一化至[0,n)区间。

Java 中数组的循环移位操作,核心是通过“三次反转”或“额外空间复制”来高效完成,避免逐个移动元素带来的 O(n×k) 时间开销。最推荐的是 三次反转法,时间复杂度 O(n),空间复杂度 O(1),且不依赖额外数组。
三次反转法(推荐,原地实现)
原理:对一个数组右移 k 位,等价于——先整体反转,再反转前 k 个元素,最后反转后 n−k 个元素。左移同理(可统一转为右移:左移 k 等价于右移 n−k)。
步骤(以 int[] arr = {1,2,3,4,5} 右移 2 位为例):
- 计算有效位移:k = k % arr.length(防止 k > n)
- 整体反转 → [5,4,3,2,1]
- 反转前 k=2 个 → [4,5,3,2,1]
- 反转后 n−k=3 个 → [4,5,1,2,3] ✅
代码示例:
public static void rotateRight(int[] arr, int k) {
if (arr == null || arr.length private static void reverse(int[] arr, int left, int right) {
while (left <h3>使用额外空间(简单直观,适合初学)</h3><p>创建新数组,按移位后的位置直接赋值。适合对空间不敏感、追求代码清晰的场景。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>右移 k 位:新数组中索引 i 的元素来自原数组的 <font color="red">(i − k + n) % n</font> 位置。</p><p>代码示例:</p><pre class="brush:java;toolbar:false;">public static int[] rotateRightWithSpace(int[] arr, int k) {
if (arr == null || arr.length == 0) return arr;
int n = arr.length;
k = k % n;
int[] result = new int[n];
for (int i = 0; i <h3>处理左移与负数 k 的统一方式</h3><p>Java 不支持负数取模的直观语义(如 -2 % 5 = -2),所以建议统一转为右移:</p>
- 左移 k 位 ⇔ 右移 (n − k % n) % n 位
- 或直接用 k = (k % n + n) % n 将任意整数 k 归一化为 [0, n) 区间内的右移量
例如:arr 长 5,k = -2 → (−2 % 5 + 5) % 5 = (−2 + 5) % 5 = 3 ⇒ 右移 3 位,效果等同左移 2 位。
注意事项与常见陷阱
- 空数组、null、长度为 0 或 1 时需提前返回,避免越界
- k 可能远大于数组长度,务必先做 k %= length
- 反转法中边界索引容易写错(如 reverse(arr, 0, k−1) 不是 k)
- 若需返回新数组而非修改原数组,三次反转法需先 clone,再对副本操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










