如何使用栈实现Codewars的Range Extraction(区间提取)算法题?
现有代码问题分析
你当前的代码只存储了每个连续区间的右端点,丢失了区间的起始值,所以最终输出的只是每个连续段的最后一个数值,和需求的区间格式化结果完全不符。
优化实现思路
- 需要用二元组记录每个连续区间的起始值和结束值,不能仅存结束值
- 遍历数组时,判断当前值是否和当前最后一个区间的结束值连续(差为1),连续则更新区间结束值,不连续则将当前区间格式化后存入结果,再新建区间
- 区间格式化规则:
- 区间仅1个值:直接输出数值本身
- 区间有2个连续值:输出两个数值,用逗号分隔
- 区间有3个及以上连续值:输出
起始值-结束值格式
- 遍历结束后处理最后一个区间,最后将所有格式化片段用逗号拼接为字符串返回
修正后的完整代码
function solution(list) { if (list.length === 0) return '' // 初始化第一个区间[start, end] let ranges = [[list[0], list[0]]] for (let i = 1; i < list.length; i++) { let lastRange = ranges[ranges.length - 1] let current = list[i] if (current === lastRange[1] + 1) { // 连续,更新区间结束值 lastRange[1] = current } else { // 不连续,新增区间 ranges.push([current, current]) } } // 格式化每个区间 let formatted = ranges.map(range => { const [start, end] = range if (start === end) return `${start}` if (end - start === 1) return `${start},${end}` return `${start}-${end}` }) // 拼接为最终字符串 return formatted.join(',') } // 测试 console.log(solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20])) // 输出:-6,-3-1,3-5,7-11,14,15,17-20
内容的提问来源于stack exchange,提问作者med azzouzi
相关产品推荐
相关产品推荐

