如何将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
相关产品推荐
相关产品推荐

