
本文详解如何在不创建新数组的前提下,直接修改原始整型数组——以前半段元素与右侧对称位置元素相加的结果覆盖原位置,后半段保持不变,最终实现原地更新并正确输出目标序列。
本文详解如何在不创建新数组的前提下,直接修改原始整型数组——以前半段元素与右侧对称位置元素相加的结果覆盖原位置,后半段保持不变,最终实现原地更新并正确输出目标序列。
在 Java 中,数组是引用类型,方法参数传递的是数组对象的引用(即内存地址),因此对形参数组的修改会直接影响原始数组。这一特性使得“原地更新”成为可能,无需额外空间复制或构造新数组。
题目要求对 int[] arr = {1, 2, 3, 4, 5} 进行如下变换:
- 数组长度为 5,中间元素索引为 length / 2 = 2,对应值 arr[2] = 3;
-
注意关键逻辑澄清:题干中“arr[0] + arr[3]”“arr[1] + arr[4]”实际隐含的是以中间索引为基准向右偏移 i 的位置,即 arr[i] + arr[midIndex + i + 1]?但结合示例 1+4=5、2+5=7 及输出 [5,7,3,4,5],可明确推导出:
- midIndex = 2(0-based),则 arr[0] 对应 arr[3] = arr[midIndex + 1],arr[1] 对应 arr[4] = arr[midIndex + 2];
- 即对前 midIndex 个元素(索引 0 到 midIndex-1),将其与 arr[midIndex + 1 + i] 相加,并将结果写回 arr[i]。
但更简洁且符合代码实现的规律是:前半段(不含中位)共 len/2 个元素,分别与从 midIndex + 1 开始的连续元素配对相加。本例中 len=5 → len/2 = 2,故 i ∈ [0, 1],对应加数索引为 3 和 4,即 arr[i] + arr[i + 3] —— 而 3 = midIndex + 1。因此通用公式为:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
int midIndex = arr.length / 2;
arr[i] = arr[i] + arr[i + midIndex + 1]; // 仅适用于奇数长度且 i <p>不过,观察提供的参考答案,其逻辑实为:<br>
✅ <strong>直接利用 arr.length / 2 计算中位索引(整除),前 len/2 个位置(i = 0, 1)分别与 arr[i + (midIndex + 1)] 相加</strong>,即 i + 3 和 i + 4,恰好匹配示例。</p><p>以下是规范、健壮的实现(支持任意奇数长度数组,已添加注释与格式优化):</p><pre class="brush:php;toolbar:false;">public class ArrayTransform {
static void transformAndPrint(int[] arr) {
int len = arr.length;
int midIndex = len / 2; // 中位索引(0-based,奇数长度时指向正中)
// 步骤1:更新前半段(索引 0 到 midIndex-1)
for (int i = 0; i <p><strong>关键注意事项:</strong> </p>
- ✅ 原地修改安全:因 Java 数组传引用,transformAndPrint(arr) 内部对 arr[i] 的赋值直接改变原始数组内容;
- ⚠️ 长度兼容性:当前逻辑针对奇数长度数组(如 5、7、9…),确保存在唯一中位索引。若需支持偶数长度,需明确定义“中间”的处理规则(如取左中位或右中位);
- ? 边界防护:代码中添加了 if (rightIndex
- ? 编码规范:采用 int[] arr 声明风格(而非 int arr[]),变量就近声明,缩进统一,符合 Java 社区最佳实践。
通过此方案,你不仅能精准生成 [5, 7, 3, 4, 5],更能掌握 Java 数组原地变换的核心思想——善用引用传递特性,以最小空间开销完成数据重构。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










