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

如何高效获取嵌套数组中的重复数字?现有实现能否优化?

问题:高效处理嵌套数组,找出重复出现的数字

我知道可以用大量if...else实现,但需要更快更高效的方法。我需要一个能遍历嵌套数组、返回其中出现多次的数字的函数。之前参考的方法不适用于嵌套数组,就算用flat(),当重复次数超过2次时代码也会失效。

示例

deepSort([[1,3,4,5], [4,7,9,1,3], [2,3,5], [1,2,3,4]]) // 返回"1,2,3,4,5"
deepSort([[1,2,3], [4,5], [6,7,8], [2,9,0]]) // 返回"2"
deepSort([[2,7,9], [4,3], [9,6,5], [1,4,3]]) // 返回"3,4,9"

我的尝试实现

function deepSort(nestedArray) {
  const flatArr = nestedArray.flat().sort();
  let results = []
  for (let i = 0; i < flatArr.length - 1; i++) {
    if (flatArr[i + 1] == flatArr[i]) {
      results.push(flatArr[i]);
    }
  }
  return (results.filter((item,index) => results.indexOf(item) === index)).join()
}

优化方案(针对大数据场景)

你的当前实现存在几个影响效率的问题:

  1. 排序开销过大:sort()的时间复杂度是O(n log n),大数据量下会占用大量计算资源,而统计重复次数根本不需要先排序。
  2. 去重操作低效:results.filter(...)里用indexOf做去重,每次查找都是O(k)(k为results长度),整体是O(k²)的时间复杂度,数据量大时会明显变慢。

更高效的实现思路是用哈希表(Map)统计出现次数,只需要遍历一次所有元素,再筛选出符合条件的数字即可:

function deepSort(nestedArray) {
  const countMap = new Map();
  
  // 递归遍历嵌套数组,统计每个数字的出现次数
  const traverse = (arr) => {
    for (const item of arr) {
      Array.isArray(item) ? traverse(item) : countMap.set(item, (countMap.get(item) || 0) + 1);
    }
  };
  traverse(nestedArray);
  
  // 筛选出现次数≥2的数字,排序后转为字符串(和原实现输出顺序一致)
  return Array.from(countMap.entries())
    .filter(([num, count]) => count >= 2)
    .map(([num]) => num)
    .sort((a, b) => a - b)
    .join(',');
}

优化点说明:

  • 避免不必要的扁平化:直接递归遍历嵌套数组,比flat()更适配不确定深度的嵌套场景,也省去了扁平化的额外开销。
  • 哈希表统计更高效:遍历所有元素的时间复杂度是O(n)(n为总元素数),远优于原实现中排序的O(n log n)。
  • 无额外去重步骤:直接从哈希表提取符合条件的数字,不需要再做二次去重,大幅降低了后续处理的开销。如果不需要结果有序,可以去掉最后的sort步骤,进一步提升速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:15:38