在JavaScript中从数组提取有序数字列表的实现问题
从数组中提取连续递增数字子列表的正确实现
需求说明
需要实现一个函数,从给定的一维数字数组中提取所有连续递增的子列表,规则如下:
- 子列表内的元素必须连续,且每个后续元素严格大于前一个元素
- 当遇到当前元素不大于前一个元素时,结束当前子列表,开始新的子列表
示例
- 示例1:输入数组
arr = [1,3,2,10,4,6,8],期望输出S = [[1,3],[2,10],[4,6,8]] - 示例2:输入数组
arr = [13,89,81,17,7,27,5],期望输出S = [[13,89],[81],[17],[7,27],[5]]
原代码存在的问题
你提供的代码存在几个关键问题:
- 逻辑匹配错误:代码默认处理二维数组(使用
arr[0].length),但需求示例均为一维数组,逻辑不符合要求 - 原数组被破坏:使用
splice修改原数组,会导致原始数据丢失且循环索引错乱 - 索引未重置:变量
j在循环外初始化,处理后续元素时不会重置,导致循环无法正常执行 - 循环逻辑混乱:嵌套
while的条件和执行逻辑无法正确分割递增子列表
正确实现方案
以下是符合需求的一维数组处理函数,逻辑清晰且不修改原数组:
function extractIncreasingSublists(arr) { // 处理空数组边界情况 if (!arr.length) return []; const result = []; // 初始化第一个子列表 let currentSublist = [arr[0]]; for (let i = 1; i < arr.length; i++) { // 当前元素大于前一个,加入当前子列表 if (arr[i] > arr[i - 1]) { currentSublist.push(arr[i]); } else { // 不满足递增,存入当前子列表并开始新列表 result.push(currentSublist); currentSublist = [arr[i]]; } } // 加入最后一个子列表 result.push(currentSublist); return result; } // 测试示例 console.log(extractIncreasingSublists([1,3,2,10,4,6,8])); // [[1,3],[2,10],[4,6,8]] console.log(extractIncreasingSublists([13,89,81,17,7,27,5])); // [[13,89],[81],[17],[7,27],[5]]
实现逻辑说明
- 先处理空数组的边界情况,避免运行报错
- 用
currentSublist存储正在构建的递增子列表,从数组第一个元素开始初始化 - 从第二个元素开始遍历数组,对比当前元素与前一个元素:
- 满足递增则加入当前子列表
- 不满足则将当前子列表存入结果,重新初始化新的子列表
- 循环结束后,将最后一个未存入的子列表加入结果数组
内容的提问来源于stack exchange,提问作者Waafa Oueslati
相关产品推荐
相关产品推荐

