问题是找到在数组中出现奇数时间的整数
例如:[1,1,1,1,1,1,10,1,1,1,1]
应该返回10
而[5,4,3,2,1,5,4,3,2,10,10]
应该返回1
。
我的代码通过了所有测试,但这两个。我不知道为什么有人可以解释?
function findOdd(A) {
var keyCounts = {};
var topKey = {};
A.forEach(function(item, val) {
keyCounts[item] = keyCounts[item] + 1 || 1;
if (keyCounts[item] % 2 !== 0) {
topKey = item;
}
});
return topKey;
}
答案 0 :(得分:1)
您的代码失败是因为您检查了" odd"在您对数组进行迭代时进行计数,因此每次找到任何新数字时,它都会覆盖topKey
。
要解决,首先计算数字,然后遍历找到的keyCounts
对象,找出哪一个是奇数:
function findOdd(A) {
let counts = A.reduce((p, n) => (p[n] = ++p[n] || 1, p), {});
return +Object.keys(counts).find(k => counts[k] % 2) || undefined;
}
答案 1 :(得分:0)
您过早分配到 topKey ,因为可能会再次出现相同的值。
这是一个解决方案,可以在每次出现时向Set
添加/删除一个值(如切换),然后从剩余的Set中获取第一个值:
function getOdd(arr) {
for (v of arr.reduce((set, v) => set.delete(v) ? set : set.add(v), new Set))
return v;
}
var arr = [5,4,3,2,1,5,4,3,2,10,10];
result = getOdd(arr);
console.log(result);