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

如何将0-20范围内数组的缺失数字按序列格式输出?

解决方案

你已经正确找出了所有缺失数字,核心问题是将连续数字序列转换为x-y格式,非连续的单个数字直接保留。可以新增区间格式化逻辑,整合到原代码中:

function missingNumbers(arr) {
    const max = 20;
    // 转成Set提升查找性能,比indexOf更高效
    const existing = new Set(arr);
    const missing = [];

    // 收集所有缺失数字
    for (let i = 0; i <= max; i++) {
        if (!existing.has(i)) {
            missing.push(i);
        }
    }

    // 格式化连续区间
    if (missing.length === 0) return "";
    
    const result = [];
    let start = missing[0];
    let end = start;

    for (let i = 1; i < missing.length; i++) {
        // 当前数字和前一个连续,更新区间结束值
        if (missing[i] === end + 1) {
            end = missing[i];
        } else {
            // 不连续,将当前区间加入结果
            result.push(start === end ? `${start}` : `${start}-${end}`);
            start = missing[i];
            end = start;
        }
    }
    // 处理最后一个区间
    result.push(start === end ? `${start}` : `${start}-${end}`);

    return result.join(",");
}

// 测试验证
console.log(missingNumbers([0, 1, 2, 8, 12, 13])); // 输出"3-7,9-11,14-20"
console.log(missingNumbers([1, 2, 5, 12, 16])); // 输出"0,3-4,6-11,13-15,17-20"
console.log(missingNumbers([1,2])); // 输出"0,3-20"

关键逻辑说明

  • 性能优化:将输入数组转为Set,用has()替代indexOf(),时间复杂度从O(n²)降到O(n),元素较多时效率提升明显。
  • 区间格式化:
    • 初始化区间的起始和结束值为缺失数组的第一个元素。
    • 遍历缺失数组,若当前数字与区间结束值连续,则更新结束值;否则将当前区间按规则格式化后存入结果,再重置区间起始和结束值。
    • 遍历结束后,必须手动处理最后一个未存入结果的区间。

内容的提问来源于stack exchange,提问作者Hein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:22