如何编写返回首个最高频率众数的函数?现有代码问题求解
解决数组众数问题(返回最先出现的最高频率元素)
你的问题出在JavaScript对象的数字键会被自动转成字符串并按升序排列,导致用for...in遍历统计对象时,顺序不是元素在原数组中的出现顺序,最终多个众数时返回了错误的结果。这里给你两个简单的解决方案:
方案一:遍历数组时直接跟踪众数(最简洁)
不需要额外处理排序问题,遍历数组的同时统计频率,只在当前元素频率大于已知最高频率时更新结果,频率相等时不更新,天然保留最先出现的众数:
function Mode(arr) { const count = {}; let maxFreq = 0; let result = 0; for (const num of arr) { // 统计当前数字的出现次数 count[num] = (count[num] || 0) + 1; // 只有当当前频率超过最高频率时,才更新结果 if (count[num] > maxFreq) { maxFreq = count[num]; result = num; } } // 无众数(所有元素出现次数都是1)时返回0 return maxFreq > 1 ? result : 0; } console.log(Mode([6, 6, 3, 3, 5, 5])); // 输出6 console.log(Mode([3, 9, 3, 1, 6])); // 输出3 console.log(Mode([1, 2, 3])); // 输出0
方案二:用Map保留插入顺序
Map会严格保留键的插入顺序(即元素在原数组中首次出现的顺序),统计后遍历Map就能按正确顺序比较:
function Mode(arr) { const freqMap = new Map(); let maxFreq = 0; let result = 0; // 先统计所有元素的频率 for (const num of arr) { freqMap.set(num, (freqMap.get(num) || 0) + 1); } // 按插入顺序遍历Map,找最先出现的最高频率元素 for (const [num, count] of freqMap) { if (count > maxFreq) { maxFreq = count; result = num; } } return maxFreq > 1 ? result : 0; }
为什么你的原代码出错?
你用对象统计后,数字键会被转换为字符串并自动升序排列,比如{6:2, 3:2, 5:2}会变成{'3':2, '5':2, '6':2}。用for...in遍历时,会先拿到'3',它的频率等于当前最高值(初始是0),所以highestValueKey被设为3,后续遍历到6时频率相等,不会更新,最终返回3而不是6。
内容的提问来源于stack exchange,提问作者Toheeb Osundare
相关产品推荐
相关产品推荐

