如何向二维数组添加数据以得到预设的目标结果
输入与预期结果
给定输入
const first = 50; const second = [[14, 16], [28, 30]];
预期输出
const expectedResult = [[0, 13], [14, 16], [17, 27], [28, 30], [31, 50]];
当前问题代码
const first = 50; const second = [[14, 16], [28, 30]].flat(1); let result = []; for(let i = 0; i < second.length; i++) { let temp = second[i]; if (i === 0) { result.push([i, temp - 1]); } result.push([i+temp, temp+2]); } console.log(result); // 输出 [[0, 13], [14, 16], [17, 18], [30, 30], [33, 32]]
问题分析与修复方案
原代码的核心问题是将二维区间数组扁平化后,遍历单个数值时逻辑混乱,错误计算了区间的起始与结束值。正确逻辑应基于原始区间数组,依次补全区间前后的空白部分:
- 补全第一个区间之前的空白:从0到第一个区间起始值减1
- 直接加入每个原始区间
- 补全当前区间与下一个区间之间的空白:当前区间结束值加1到下一个区间起始值减1
- 补全最后一个区间到
first的空白:最后一个区间结束值加1到first
正确代码
const first = 50; const second = [[14, 16], [28, 30]]; const result = []; // 处理第一个区间之前的部分 if (second[0][0] > 0) { result.push([0, second[0][0] - 1]); } // 遍历区间,补全区间间的空白 for (let i = 0; i < second.length; i++) { // 添加当前区间 result.push(second[i]); // 非最后一个区间时,补全到下一个区间的空白 if (i < second.length - 1) { const currentEnd = second[i][1]; const nextStart = second[i+1][0]; // 仅当区间有效时添加 if (currentEnd + 1 <= nextStart - 1) { result.push([currentEnd + 1, nextStart - 1]); } } } // 处理最后一个区间到first的部分 const lastEnd = second[second.length - 1][1]; if (lastEnd + 1 <= first) { result.push([lastEnd + 1, first]); } console.log(result); // 输出 [[0,13],[14,16],[17,27],[28,30],[31,50]]
逻辑说明
- 增加有效性判断:避免出现
[0,-1]或[17,16]这类无效区间 - 基于原始二维区间数组处理,无需扁平化,保证区间的完整性
- 分步处理首尾和区间间的空白,逻辑清晰且覆盖所有场景
内容的提问来源于stack exchange,提问作者Shbdn
相关产品推荐
相关产品推荐

