如何修复JavaScript数组多众数提取代码?避免众数重复输出
修复提取唯一众数的JavaScript代码
原代码的问题在于遍历数组时,会对每个重复元素重复计算出现次数,并且每次遇到计数等于当前最大次数时就直接将元素加入结果数组,导致同一个众数被多次添加。以下是两种修复方案:
方案一:先统计频率(高效推荐)
先通过对象统计每个元素的出现次数,再基于频率找出所有众数,这种方法时间复杂度为O(n),效率更高,且自然避免重复元素:
const array = [1, 1, 2, 2, 2, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9]; // 统计元素出现频率 const frequencyMap = {}; for (const num of array) { frequencyMap[num] = (frequencyMap[num] || 0) + 1; } // 获取最大出现次数 const maxStreak = Math.max(...Object.values(frequencyMap)); // 收集所有众数 const modus = Object.keys(frequencyMap) .map(Number) // 将字符串键转换为数字类型 .filter(num => frequencyMap[num] === maxStreak); console.log(modus); // 输出:[7, 8]
方案二:在原代码基础上修改
如果要保留原代码的遍历逻辑,只需添加判断条件,确保当前元素未被加入结果数组时再执行添加操作:
const array = [1, 1, 2, 2, 2, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9]; let maxStreak = 0; let modus = []; for (let i = 0; i < array.length; i++) { let series = 0; for (let j = 0; j < array.length; j++) { if (array[i] === array[j]) { series++; } } if (series > maxStreak) { maxStreak = series; modus = [array[i]]; // 重置结果数组为当前元素 } else if (series === maxStreak && !modus.includes(array[i])) { // 仅当元素未在结果数组中时添加 modus.push(array[i]); } } console.log(modus); // 输出:[7, 8]
内容的提问来源于stack exchange,提问作者LukaM
相关产品推荐
相关产品推荐

