
本文详解如何基于数组中点,将前半段元素与右偏移位置元素相加,并将结果写回原数组前半段,后半段保持不变,最终实现原地更新与正确输出。
本文详解如何基于数组中点,将前半段元素与右偏移位置元素相加,并将结果写回原数组前半段,后半段保持不变,最终实现原地更新与正确输出。
在 Java 中处理此类数组变换任务时,关键在于理解数组是引用传递——方法内对 int[] arr 的修改会直接影响原始数组。因此,无需额外创建新数组或复制结果,只需按逻辑计算并直接赋值给 arr[i] 即可完成“原地更新”。
题目要求的核心逻辑如下(以 arr = {1, 2, 3, 4, 5} 为例):
- 数组长度为 5,中点索引为 length / 2 = 2,对应中间元素 arr[2] = 3;
- 注意:题干中“right side closest element of middle element”实际指从中点索引开始向右偏移 i 步,即 arr[i + midIndex],而非 arr[i + arr[midIndex]](原代码误用 z = arr[midIndex] 导致逻辑错误);
- 正确偏移应为:arr[0] + arr[2+0] = 1+3=4?但样例输出是 5,7,3,4,5 → 验证得:arr[0]+arr[3]=1+4=5,arr[1]+arr[4]=2+5=7,说明右偏移基准是 midIndex + 1(即中点后一位),且仅对前 midIndex 个元素配对(此处 midIndex = 2,故 i = 0,1)。
✅ 正确逻辑推导:
- midIndex = arr.length / 2(整数除法,5/2=2);
- 前半段索引范围:i ∈ [0, midIndex),共 midIndex 个元素;
- 对应右侧索引:i + midIndex + 1?不对 —— 样例中 i=0 → 3,i=1 → 4,即 i + (midIndex + 1) → 0+3=3, 1+3=4,所以右起始偏移量 = midIndex + 1;
- 但需确保 i + midIndex + 1 < arr.length,本例中 midIndex+1 = 3,i 最大为 1 → 1+3=4 < 5,合法。
因此,修正后的实现应:
立即学习“Java免费学习笔记(深入)”;
public class Arraym {
static void transform(int[] arr) {
int n = arr.length;
int midIndex = n / 2; // 中点索引(0-based)
// 将前 midIndex 个元素替换为 arr[i] + arr[i + midIndex + 1]
for (int i = 0; i < midIndex; i++) {
int rightIndex = i + midIndex + 1;
if (rightIndex < n) {
arr[i] = arr[i] + arr[rightIndex];
}
}
// 后半段(从 midIndex 开始)保持不变,无需操作
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
transform(arr);
// 输出验证
System.out.print("Transformed array: ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i < arr.length - 1) System.out.print(" ");
}
System.out.println(); // 输出:5 7 3 4 5
}
}⚠️ 重要注意事项:
- 避免索引越界:rightIndex = i + midIndex + 1 必须严格校验 < arr.length,否则抛 ArrayIndexOutOfBoundsException;
- 原地修改即生效:因 Java 数组传参为引用,transform(arr) 后 arr 已被修改,后续遍历直接反映结果;
- 命名与风格规范:使用 int[] arr(而非 int arr[]),变量就近声明(如 n, midIndex, rightIndex),增强可读性与维护性;
- 边界测试建议:尝试偶数长度数组(如 {1,2,3,4},midIndex=2,前 2 位配对 arr[0]+arr[3]=1+4=5, arr[1]+arr[4]→越界),此时需在循环内加 if 守护,确保鲁棒性。
综上,掌握索引映射关系、善用引用特性、辅以边界防护,即可优雅实现此类数组原地重构任务。


















