JavaScript:无序数组唯一元素查找函数返回错误值的问题排查
问题分析与解决
原代码的核心错误
- 需求理解完全偏差:你的代码实现的是「统计数组去重后的元素总数」,而非「查找只出现一次的唯一元素」。比如测试用例
[9,7,7,6,6,5,5,5]去重后有4个元素,所以返回4,但实际需要找的是仅出现1次的9。 - 时间复杂度不达标:调用
sort()排序的时间复杂度是O(n log n),不符合要求的O(n)。 - 逻辑偏离目标:代码核心是原地去重,和“找唯一出现元素”的需求完全无关。
符合要求的解法(单数组遍历循环+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
相关产品推荐
相关产品推荐

