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

JavaScript如何将数组按连续整数序列拆分为多个子数组

数组连续序列拆分实现

需求说明

实现数组拆分逻辑:将输入数组中属于同一连续整数序列的元素归为同一个子数组,数组中存在多少组独立的连续整数序列,就拆分生成多少个对应的子数组。
对应测试示例:

  • 示例1:输入数组为[0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15],期望输出为两个子数组:[0, 1, 2, 3, 4, 5, 6, 7, 8]、[12, 13, 14, 15]
  • 示例2:输入数组为[1, 2, 3, 4, 5, 14, 15, 16, 22, 23, 24, 25],期望输出为三个子数组:[1, 2, 3, 4, 5]、[14, 15, 16]、[22, 23, 24, 25]

原有代码问题

你之前编写的代码如下:

let arrnew = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15] 
let arr2 = []

for (let j = 0; j < arrnew.length; j++) {
    if (arrnew[j + 1] - 1 === arrnew[j]) {
        arr2.push(arrnew[j])
    }
}

这段代码无法得到正确结果的原因有三个:

  • 没有做二维分组,所有符合条件的元素都被塞进了同一个一维数组,无法区分不同的连续序列
  • 每个连续序列的最后一个元素不会被加入结果:因为最后一个元素的下一个值和它的差不为1,不满足判断条件,会被遗漏
  • 遍历到数组最后一位时,arrnew[j+1]为undefined,参与数值计算会得到NaN,存在隐式类型转换问题

正确实现代码

实现逻辑:初始化第一个分组后从第二个元素开始遍历,当前元素和上一个元素差为1就加入当前分组,差不为1就把当前分组存到结果里,新建分组存当前元素,遍历结束后把最后一个分组存入结果即可。

function splitConsecutive(arr) {
    if (arr.length === 0) return []
    const result = []
    // 初始化第一个连续分组
    let currentGroup = [arr[0]]
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] - arr[i-1] === 1) {
            // 连续,加入当前分组
            currentGroup.push(arr[i])
        } else {
            // 序列断开,保存当前分组,新建分组
            result.push(currentGroup)
            currentGroup = [arr[i]]
        }
    }
    // 补上遍历结束后剩余的最后一个分组
    result.push(currentGroup)
    return result
}

// 测试用例
console.log(splitConsecutive([0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15]))
// 输出 [[0,1,2,3,4,5,6,7,8],[12,13,14,15]]
console.log(splitConsecutive([1, 2, 3, 4, 5, 14, 15, 16, 22, 23, 24, 25]))
// 输出 [[1,2,3,4,5],[14,15,16],[22,23,24,25]]

注意:以上实现默认输入是已按升序排序、无重复元素的数组,如果输入是乱序的,需要先执行arr.sort((a, b) => a - b)排序后再做分组处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:09:32