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

如何编写返回首个最高频率众数的函数?现有代码问题求解

解决数组众数问题(返回最先出现的最高频率元素)

你的问题出在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:05:19