You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现按元素值重复对应索引的数组扩展功能时遇异常,请求排查

解决数组扩展:按元素值重复对应索引的问题

看起来你遇到的核心问题是索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:54:07