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

JavaScript:无序数组唯一元素查找函数返回错误值的问题排查

问题分析与解决

原代码的核心错误

  1. 需求理解完全偏差:你的代码实现的是「统计数组去重后的元素总数」,而非「查找只出现一次的唯一元素」。比如测试用例[9,7,7,6,6,5,5,5]去重后有4个元素,所以返回4,但实际需要找的是仅出现1次的9。
  2. 时间复杂度不达标:调用sort()排序的时间复杂度是O(n log n),不符合要求的O(n)。
  3. 逻辑偏离目标:代码核心是原地去重,和“找唯一出现元素”的需求完全无关。

符合要求的解法(单数组遍历循环+O(n)时间)

下面的代码只用一次循环遍历数组统计元素出现次数,整体时间复杂度为O(n),同时能正确找到唯一出现一次的元素:

function findUniq(arr) {
  const countMap = {};
  // 仅用一个for循环遍历数组统计次数
  for (const num of arr) {
    countMap[num] = (countMap[num] || 0) + 1;
  }
  // 遍历统计结果找唯一元素(此循环遍历的是统计对象,不属于数组遍历循环)
  for (const key in countMap) {
    if (countMap[key] === 1) {
      return Number(key);
    }
  }
  return null; // 数组无唯一元素时返回
}

const testArray1 = [9, 7, 7, 9, 6, 6, 5, 5, 5];
console.log(findUniq(testArray1)); // 输出9
const testArray2 = [9,7,7,6,6,5,5,5];
console.log(findUniq(testArray2)); // 输出9

解法说明

  • 用对象countMap记录每个元素的出现次数,数组遍历仅一次,时间复杂度O(n)。
  • 遍历统计对象的时间复杂度为O(k)(k为数组中不同元素的数量,k≤n),整体仍为O(n)。
  • 最终找到出现次数为1的元素,即为目标的唯一元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:58:57