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

如何查找数组中按顺序排列的三个最大数,现有实现逻辑问题咨询

三个最大数查找功能修复方案

现有代码问题

  • 比较逻辑错误:使用原数组遍历索引i读取result[i]判断大小,i取值会超过2,直接访问结果数组不存在的下标,判断逻辑完全失效
  • 循环变量混淆:内层循环条件误用外层变量i,且循环内自增i,直接打乱原数组的遍历逻辑
  • 移位逻辑错误:移位时直接读取原数组下一个位置的值,没有对结果数组内已有的历史最大值做移动操作

核心移位逻辑说明

我们约定结果数组result按从小到大存储三个最大值,即result[0]为第三大值,result[1]为第二大值,result[2]为最大值,每次遍历新元素时按以下规则更新:

  1. 若新元素大于最大值result[2]:原有最大值降级为第二大,原有第二大降级为第三大,新元素作为新的最大值
  2. 若新元素仅大于第二大值result[1]:原有第二大降级为第三大,新元素作为新的第二大
  3. 若新元素仅大于第三大值result[0]:直接替换第三大值
  4. 初始null值兼容:前三个元素先直接填充结果数组,无需比较移位

修复后代码

function findThreeLargestNumbers(array) {
  // 按从小到大存三个最大数:[第三大, 第二大, 最大]
  let result = [null, null, null];
  
  // 辅助更新函数:处理移位逻辑
  function updateResult(num) {
    if (result[2] === null || num > result[2]) {
      // 挤掉最大值,前面元素后移
      shiftAndUpdate(2, num);
    } else if (result[1] === null || num > result[1]) {
      // 挤掉第二大
      shiftAndUpdate(1, num);
    } else if (result[0] === null || num > result[0]) {
      // 挤掉第三大
      shiftAndUpdate(0, num);
    }
  }

  // 移位函数:把pos位置前面的元素依次往后移一位,新值放到pos位置
  function shiftAndUpdate(pos, num) {
    for (let i = 0; i < pos; i++) {
      result[i] = result[i + 1];
    }
    result[pos] = num;
  }

  // 遍历原数组
  for (let num of array) {
    updateResult(num);
  }

  return result;
}

console.log(findThreeLargestNumbers([141, 1, 17, -7, -17, -27, 18, 541, 8, 7, 7]));
// 输出:[18, 141, 541]

如果需要结果按从大到小排列,最后返回result.reverse()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:03