
本文介绍一种不使用额外数组、仅通过原地旋转实现将数组最小值移至首位置的高效方法,包含查找最小值索引、智能左右旋转策略及完整可运行代码。
本文介绍一种不使用额外数组、仅通过原地旋转实现将数组最小值移至首位置的高效方法,包含查找最小值索引、智能左右旋转策略及完整可运行代码。
要解决“将数组循环移动,使最小元素位于首位,且保持其余元素相对顺序不变”这一问题,关键在于避免创建新数组、不依赖集合类或字符串工具,同时满足题干中对 premakni() 方法签名(返回 int[])与行为(不修改原数组)的双重约束。
观察测试用例可知:
- 输入 a = {0,1,2,-1,-2} → 输出 b = {-2,0,1,2,-1}
- 输入 a = {8,5,6,2,1,-1,-100,425,84} → 输出 b = {-100,425,84,8,5,6,2,1,-1}
这本质上是以最小值索引为分割点,将数组切分为两段并交换位置:即 arr[minIdx..end] + arr[0..minIdx-1]。但题目禁止新建数组,因此需通过原地旋转(rotation) 实现等效效果。
核心思路:最小值索引决定旋转方向与步数
- 遍历一次,找到最小值的索引 minIdx(时间复杂度 O(n));
- 若 minIdx == 0,无需旋转,直接返回原数组副本;
- 否则,需将前 minIdx 个元素整体后移,后 length - minIdx 个元素前移——这等价于左旋 minIdx 步(即每次将首元素移到末尾,重复 minIdx 次)。
✅ 但朴素左旋 minIdx 次,最坏情况(如 minIdx ≈ n)需 O(n²) 时间。更优解是:判断旋转方向以减少移动次数——若 minIdx ≤ length/2,执行 minIdx 次左旋;否则执行 length - minIdx 次右旋(因右旋 k 步 ≡ 左旋 n-k 步)。
完整实现(符合题目所有限制)
import java.util.Arrays;
public class ArrayRotator {
/**
* 返回新数组:最小值位于首位,其余元素保持相对顺序,原数组不变
* @param arr 输入数组(非 null,长度 ≥ 1)
* @return 新数组,已按要求旋转
*/
public static int[] premakni(int[] arr) {
if (arr == null || arr.length == 0) return arr;
// 步骤1:查找最小值索引
int minIdx = 0;
for (int i = 1; i 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = last;
}
}
// 测试示例
public static void main(String[] args) {
int[] a = {0, 1, 2, -1, -2};
int[] b = premakni(a);
System.out.println("原数组: " + Arrays.toString(a)); // [0, 1, 2, -1, -2]
System.out.println("结果: " + Arrays.toString(b)); // [-2, 0, 1, 2, -1]
int[] c = {8, 5, 6, 2, 1, -1, -100, 425, 84};
int[] d = premakni(c);
System.out.println("原数组: " + Arrays.toString(c)); // [8, 5, 6, 2, 1, -1, -100, 425, 84]
System.out.println("结果: " + Arrays.toString(d)); // [-100, 425, 84, 8, 5, 6, 2, 1, -1]
}
}
注意事项与关键点
- 原数组不可修改:题目测试调用 int[] b = premakni(a) 并期望 a 保持不变,因此必须使用 Arrays.copyOf() 创建副本再旋转;
- 旋转方向优化:minIdx ≤ n/2 时左旋更少步数,反之右旋更优,避免最坏 O(n²) 性能;
- 边界处理:空数组、单元素数组均需兼容(本实现已覆盖);
- 时间复杂度:O(n) 查找 + O(n) 旋转 = O(n);空间复杂度:O(n)(仅用于返回新数组,符合题目“不创建额外表”指不引入辅助存储结构,而非禁止返回新数组);
- 不要混淆“void 方法”与题干实际需求:题目测试代码明确调用 int[] b = premakni(a),说明方法必须返回新数组——原始问题描述中 void premakni() 可能是笔误或旧版本要求,应以测试用例为准。
该方案严格遵循约束,逻辑清晰,性能可靠,可直接用于作业提交或生产环境。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











