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

在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]]

原代码存在的问题

你提供的代码存在几个关键问题:

  1. 逻辑匹配错误:代码默认处理二维数组(使用arr[0].length),但需求示例均为一维数组,逻辑不符合要求
  2. 原数组被破坏:使用splice修改原数组,会导致原始数据丢失且循环索引错乱
  3. 索引未重置:变量j在循环外初始化,处理后续元素时不会重置,导致循环无法正常执行
  4. 循环逻辑混乱:嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:40:53