java中数组右循环移动的核心方法是三次反转法(推荐)或取模索引映射;前者原地操作、o(1)空间,步骤为整体反转→前k%n元素反转→后n−k%n元素反转;后者适合新建数组,直接将arr[i]赋值到newarr[(i+k)%n]。

Java 中实现数组元素向右循环移动指定位数,核心思路是“三次反转法”或“取模索引映射”,两者都高效且不依赖额外空间(除临时变量外)。关键在于理解循环移动的本质:末尾的 k 个元素移到开头,其余元素顺延到后面。
用三次反转法(推荐,原地操作、O(1) 额外空间)
该方法基于一个数学观察:向右移动 k 位等价于先整体反转,再分别反转前 k 个和后 n−k 个元素。步骤清晰、易理解、无越界风险。
- 先对整个数组反转
- 再对前
k % n个元素反转(即新数组的头部) - 最后对剩余
n − k % n个元素反转
注意要先对 k 取模(k = k % n),避免移动超过数组长度——比如长度为 5 的数组右移 7 位,等价于右移 2 位。
用取模索引映射(适合只读场景或需新数组)
如果允许创建新数组,可直接按目标位置赋值:原数组索引 i 的元素,应放到新数组索引 (i + k) % n 的位置。这种方法逻辑直观,代码简洁。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 计算有效移动位数:
k = k % arr.length - 遍历原数组,对每个
i,执行newArr[(i + k) % n] = arr[i] - 若需原地修改,也可借助临时数组暂存,再复制回原数组
处理边界与常见陷阱
实际编码中容易出错的地方集中在边界条件:
- 数组为空或长度为 1 → 直接返回,无需操作
-
k为负数 → 可转为等效正向移动(如右移 -2 位 ≡ 左移 2 位 ≡ 右移n−2位),但通常题目约定k ≥ 0 - 未对
k取模导致索引越界或无效移动 → 必须写k %= n - 反转时下标计算错误(如用
end-1而非end)→ 建议封装一个reverse(arr, left, right)辅助方法,闭区间操作更安全
一个完整可运行示例(三次反转法)
以 [1,2,3,4,5] 向右移动 2 位为例:
- 原始:
[1,2,3,4,5] - 整体反转 →
[5,4,3,2,1] - 前 2 个反转 →
[4,5,3,2,1] - 后 3 个反转 →
[4,5,1,2,3]✔️
代码片段(含取模和空检查):
public static void rotate(int[] nums, int k) {
if (nums == null || nums.length reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
static void reverse(int[] arr, int left, int right) { while (left
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










