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

如何使用栈实现Codewars的Range Extraction(区间提取)算法题?

现有代码问题分析

你当前的代码只存储了每个连续区间的右端点,丢失了区间的起始值,所以最终输出的只是每个连续段的最后一个数值,和需求的区间格式化结果完全不符。

优化实现思路
  1. 需要用二元组记录每个连续区间的起始值和结束值,不能仅存结束值
  2. 遍历数组时,判断当前值是否和当前最后一个区间的结束值连续(差为1),连续则更新区间结束值,不连续则将当前区间格式化后存入结果,再新建区间
  3. 区间格式化规则:
    • 区间仅1个值:直接输出数值本身
    • 区间有2个连续值:输出两个数值,用逗号分隔
    • 区间有3个及以上连续值:输出起始值-结束值格式
  4. 遍历结束后处理最后一个区间,最后将所有格式化片段用逗号拼接为字符串返回
修正后的完整代码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:08