JavaScript查找数组出现奇数次整数的代码运行错误求解决
问题分析
- 核心逻辑错误:题目要求返回出现次数为奇数的整数本身,你的代码错误将该整数的出现次数赋值给返回变量,而非整数本身。
- 逻辑与命名、日志不匹配:判定条件为次数为奇数的分支,却将结果存入
evenOccurence变量,日志也错误将奇数次数描述为偶数,还误打印了整个次数数组而非当前项的次数。 - 循环变量未声明:
for (i of A)中的i未加声明关键字,会泄漏为全局变量,严格模式下直接报错。 - 属性类型问题:普通对象的属性名会自动转为字符串,最终取出的结果需要转回数字类型,才符合题目返回整数的要求。
修复后代码
function findOdd(A) { const isOdd = (x) => x % 2 !== 0; const counts = {}; // 声明循环变量 for (const i of A) { counts[i] = counts[i] ? counts[i] + 1 : 1; } const numOccurences = Object.values(counts); const occurences = Object.getOwnPropertyNames(counts); let target; for (let y = 0; y < numOccurences.length; y++) { if (isOdd(numOccurences[y])) { // 取对应的整数并转回数字类型 target = Number(occurences[y]); console.log(`值 ${occurences[y]} 出现 ${numOccurences[y]} 次,为奇数`); } } return target; } // 测试用例输出7,符合预期 console.log(findOdd([7,7,8,8,7,5,5,5,5,5,5,5]));
更优解法
利用位运算异或的特性:相同数字异或结果为0,0异或任意数字等于该数字本身。由于题目保证仅有一个数出现奇数次,其余均为偶数次,遍历一次数组异或所有元素即可得到结果,空间复杂度为O(1),效率更高:
function findOdd(A) { return A.reduce((prev, curr) => prev ^ curr, 0); }
内容的提问来源于stack exchange,提问作者ZamMnyusi
相关产品推荐
相关产品推荐

