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

JavaScript嵌套数组元素连续比较实现问题求助

问题分析

原代码的核心问题是内层循环条件错误:j < s[i].length 限制循环只能针对子数组的固定长度(2),导致大部分比较无法执行。另外,s.indexOf(s[i]) 获取索引存在风险(重复元素会返回错误索引),且原逻辑未处理最后一个元素与第一个元素的循环比较。

修正方案

只需要单循环遍历每个元素,通过(i+1) % s.length获取下一个元素的索引(实现循环比较),同时直接使用当前索引替代indexOf避免错误:

console.log(allocateRooms([[1,5], [2,4], [6,8], [7,7]]));

function allocateRooms(c) {
  // 拷贝原数组并按到达时间排序,避免修改输入参数
  let s = [...c].sort((a, b) => a[0] - b[0]);
  let rooms = [];

  // 遍历每个元素,与下一个元素(最后一个的下一个是第一个)比较
  for (let i = 0; i < s.length; i++) {
    // 计算下一个元素的索引,实现循环比较
    const nextIdx = (i + 1) % s.length;
    const depart = s[i][1];
    const arrive = s[nextIdx][0];

    if (depart >= arrive) {
      // 记录排序后的元素编号(从1开始计数)
      rooms.push(i + 1);
      rooms.push(nextIdx + 1);
    } else {
      rooms.push(0);
    }
  }
  return rooms;
}

代码说明

  • 用[...c]拷贝原数组,避免修改输入的原始数据
  • (i+1) % s.length 确保最后一个元素的下一个比较对象是第一个元素,完成循环比较
  • 直接使用i和nextIdx获取元素位置,替代s.indexOf,避免重复元素导致的索引错误
  • 循环覆盖所有需求的比较:[1,5]与[2,4]、[2,4]与[6,8]、[6,8]与[7,7]、[7,7]与[1,5]

保留原数组编号的版本

如果需要记录原数组的元素编号(而非排序后的编号),可以在排序时保留原索引:

console.log(allocateRooms([[1,5], [2,4], [6,8], [7,7]]));

function allocateRooms(c) {
  // 保留原数组的元素编号,再按到达时间排序
  let s = c.map((item, idx) => ({...item, originalIdx: idx + 1})).sort((a, b) => a[0] - b[0]);
  let rooms = [];

  for (let i = 0; i < s.length; i++) {
    const nextIdx = (i + 1) % s.length;
    const depart = s[i][1];
    const arrive = s[nextIdx][0];

    if (depart >= arrive) {
      // 记录原数组的元素编号
      rooms.push(s[i].originalIdx);
      rooms.push(s[nextIdx].originalIdx);
    } else {
      rooms.push(0);
    }
  }
  return rooms;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:33:24