找到在数组JavaScript中出现奇数次的int

时间:2017-04-05 12:00:58

标签: javascript

问题是找到在数组中出现奇数时间的整数 例如:[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;
}

2 个答案:

答案 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);