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

