JavaScript数组查找唯一出现数字:代码仅返回单个结果求解
修正代码以返回数组中所有仅出现一次的数字
你的代码核心逻辑是对的——用对象记录首次出现的元素,重复出现时删除对应键,但最后只取了第一个结果,导致只能返回一个符合条件的数字。以下是修正后的代码:
function printSpecialNumbers(uniqueNum) { var obj = {}; for (var i = 0; i < uniqueNum.length; i++) { const num = uniqueNum[i]; if (typeof obj[num] !== "undefined") { delete obj[num]; continue; } obj[num] = i; } // 将对象的所有键转换为数字数组返回 return Object.keys(obj).map(Number); } let result = printSpecialNumbers([1, 5, 1, 7]); console.log(result); // 输出 [5,7]
关键修正点:
- 原代码返回
Number(Object.keys(obj)[0]),只取了对象的第一个键,改成Object.keys(obj).map(Number)后,会把所有剩余的键(也就是仅出现一次的数字)转换成数字数组返回。 - 当没有符合条件的数字时,
Object.keys(obj)会返回空数组,map后还是空数组,满足需求。
时间效率说明:
这个方案的时间复杂度是O(n):
- 遍历数组一次,每个元素的存/删对象键操作都是O(1)。
- 最后转换对象键为数组的操作,最多遍历n次(最坏情况所有元素都只出现一次),整体还是线性时间,符合高效要求。
测试用例补充:
// 无特殊数字的情况 console.log(printSpecialNumbers([2,2,3,3])); // 输出 [] // 多个特殊数字的情况 console.log(printSpecialNumbers([4,5,6,4,7])); // 输出 [5,6,7]
内容的提问来源于stack exchange,提问作者Lanny
相关产品推荐
相关产品推荐

