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

为何无法向数组push(-1)?求更优重复数字统计方案

问题解决与优化实现

问题原因及修复

你代码中无法推入-1的核心问题是数组为空的判断逻辑错误:
在JavaScript里,数组是引用类型,result == []比较的是两个数组对象的引用地址,而非内容,因此这个判断永远为false,导致无法执行push(-1)。

只需将判断条件改为检查数组长度:

// 替换原代码中的if判断
if (result.length === 0) {
  result.push(-1);
}

修改后,第三个测试用例map([3,5,7,9,1])会正确返回[-1]。

从前往后统计的优化实现

如果需要严格按照数组中元素第一次出现的顺序收集重复次数(避免重复处理同一元素),可以使用以下更简洁高效的实现:

function countDuplicates(arr) {
  // 用reduce一次性统计元素出现次数
  const countMap = arr.reduce((map, num) => {
    map.set(num, (map.get(num) || 0) + 1);
    return map;
  }, new Map());

  const result = [];
  const processed = new Set();

  // 按数组遍历顺序,只收集首次出现的重复元素次数
  for (const num of arr) {
    if (!processed.has(num) && countMap.get(num) > 1) {
      result.push(countMap.get(num));
      processed.add(num);
    }
  }

  // 空结果时返回[-1]
  return result.length === 0 ? [-1] : result;
}

// 测试用例
console.log(countDuplicates([1, 2, 3, 3, 3, 3, 4, 4])); // [4, 2]
console.log(countDuplicates([3, 2, 4, 4, 2, 5, 2, 5, 5])); // [3, 2, 3]
console.log(countDuplicates([3, 5, 7, 9, 1])); // [-1]

优化点说明

  • 用reduce替代单独的forEach统计次数,代码更紧凑
  • 遍历原数组结合Set,确保按元素首次出现顺序添加结果,完全符合“从前往后统计”的需求
  • 直接使用数字作为Map的键,避免了原代码中不必要的字符串转换
  • 逻辑分层清晰,可读性和维护性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:05:40