实现按元素值重复对应索引的数组扩展功能时遇异常,请求排查
解决数组扩展:按元素值重复对应索引的问题
看起来你遇到的核心问题是索引0被跳过、遍历不完整,这大概率是循环起始位置错误或者总长度计算遗漏了索引0的元素导致的。咱们一步步来修复这个问题:
常见错误原因分析
你可能不小心把循环的起始索引设成了1而不是0,或者计算新数组总长度时漏掉了原数组第一个元素的值——这会直接导致索引0完全不被处理,同时新数组长度不够,后续遍历也会出问题。比如类似这样的错误代码:
// 错误示例:跳过了索引0 public static int[] expand(int[] arr) { int totalLength = 0; // 这里从i=1开始,漏掉了arr[0]的长度贡献 for (int i = 1; i < arr.length; i++) { totalLength += arr[i]; } int[] result = new int[totalLength]; int index = 0; // 同样从i=1开始,完全跳过索引0的填充 for (int i = 1; i < arr.length; i++) { int count = arr[i]; for (int j = 0; j < count; j++) { result[index++] = i; } } return result; }
正确的实现方案
要实现需求,我们需要分两步:先计算新数组的总长度,再遍历原数组每个索引,按元素值重复填充。以下是完整的正确代码:
public static int[] expand(int[] arr) { // 第一步:计算新数组的总长度(累加所有元素的值) int totalLength = 0; for (int num : arr) { totalLength += num; } // 初始化结果数组 int[] result = new int[totalLength]; int currentPos = 0; // 跟踪新数组当前填充的位置 // 第二步:遍历原数组的每个索引i,重复填充i对应次数 for (int i = 0; i < arr.length; i++) { int repeatCount = arr[i]; // 重复repeatCount次,将索引i放入结果数组 for (int j = 0; j < repeatCount; j++) { result[currentPos++] = i; } } return result; }
代码说明
- 总长度计算:用增强for循环遍历原数组所有元素,确保包括索引0在内的每个元素都被累加,得到正确的新数组长度。
- 填充逻辑:用
currentPos指针记录新数组的当前位置,每次填充后自增,避免覆盖或遗漏元素。 - 循环起始:外层循环从
i=0开始,确保原数组的每一个索引都被处理,不会跳过索引0。
测试示例
输入expand(new int[]{3, 2, 5}),会生成:[0, 0, 0, 1, 1, 2, 2, 2, 2, 2],完全符合你的需求。
另外,这个实现还能处理边界情况:比如原数组为空时返回空数组;如果某个元素值为0(比如new int[]{0, 2}),会跳过该索引,返回[1, 1]。
内容的提问来源于stack exchange,提问作者climdyclam
相关产品推荐
相关产品推荐

