如何查找数组中按顺序排列的三个最大数,现有实现逻辑问题咨询
三个最大数查找功能修复方案
现有代码问题
- 比较逻辑错误:使用原数组遍历索引
i读取result[i]判断大小,i取值会超过2,直接访问结果数组不存在的下标,判断逻辑完全失效 - 循环变量混淆:内层循环条件误用外层变量
i,且循环内自增i,直接打乱原数组的遍历逻辑 - 移位逻辑错误:移位时直接读取原数组下一个位置的值,没有对结果数组内已有的历史最大值做移动操作
核心移位逻辑说明
我们约定结果数组result按从小到大存储三个最大值,即result[0]为第三大值,result[1]为第二大值,result[2]为最大值,每次遍历新元素时按以下规则更新:
- 若新元素大于最大值
result[2]:原有最大值降级为第二大,原有第二大降级为第三大,新元素作为新的最大值 - 若新元素仅大于第二大值
result[1]:原有第二大降级为第三大,新元素作为新的第二大 - 若新元素仅大于第三大值
result[0]:直接替换第三大值 - 初始
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
相关产品推荐
相关产品推荐

