查找在数组中出现奇数次的int

时间:2019-06-16 18:51:49

标签: javascript

我正在执行此任务,我需要找到一个恰好在数组中出现奇数次的数字。

我相信我已经差不多完成了,但是如果某个数字连续出现多次(例如1中的[1,1,3,1,1]),则无论该数字是否出现,它将始终返回该数字奇数次。

function findOdd(A) {
  var a;
  var count = 0;
  for (var i = 0; i < A.length; i++) {
    a = A[i];
    for (var l = i + 1; l < A.length; l++) {
      if (a == A[l]) {
        count++;
      }
    }
    if (!(count % 2)) {
      break;
    } else {
      count = 0;
    }
  }
  return a;
}

console.log(findOdd([ 1, 1, 2, -2, 5, 2, 4, 4, -1, -2, 5 ]));

如果[i] = [i + 1],我尝试过加1来计数,但这没用。

我希望findOdd([1, 1, 2, -2, 5, 2, 4, 4, -1, -2, 5])的输出是-1,但它是1。该函数始终返回第一个数字,该数字恰好等于数组的下一个元素。

4 个答案:

答案 0 :(得分:0)

无需重置计数或暂停。

function findOdd(A) {
    for (var i = 0; i < A.length; i++){
        var count = 0;
        for (var l = 0; l < A.length; l++) {
            if (A[i] === A[l]) count++;
        }
        if (count % 2 !== 0) return A[i];
    }
}

要注意的重要一点是,内循环不是从i+1开始,而是从0开始。当A[i]A[l]相匹配时,我们递增count。出现奇数次的数字也会导致count也变成奇数,我们可以返回该数字。

答案 1 :(得分:0)

您可以先对所有值进行计数,然后再获得具有奇数的值。

function getOddCount(array) {
    var value,
        count = {},
        k;

    for (value of array) count[value] = (count[value] || 0) + 1;
    for (k in count) if (count[k] % 2) return +k;
}

console.log(getOddCount([1, 1, 3, 1, 1]));
console.log(getOddCount([1, 1, 2, -2, 5, 2, 4, 4, -1, -2, 5]));

答案 2 :(得分:0)

以下方法可行,但我想知道性能与仅进行for循环相比如何。复杂程度似乎是相同的。

function findOdd(a) {
  let m = {};

  a.forEach(e => (m[e] in m) ? m[e] += 1 : m[e] = 1);
  for (k in m) {
    if (m[k] % 2 != 0) return k;
  }
}

console.log(findOdd([1, 1, 3, 1, 1]));
console.log(findOdd([1, 1, 2, -2, 5, 2, 4, 4, -1, -2, 5]));

答案 3 :(得分:0)

简单的实现只使用一个对象来存储每个元素的频率,然后在其末尾进行迭代以查找出现奇数次的元素。

function findOdd(arr) {
    const freq = {};
    for(const num of arr){
        freq[num] = (freq[num] || 0) + 1;
    }
    return +Object.keys(freq).find(num => freq[num] % 2 == 1);
}

更有效的实现可以利用按位XOR(^)的属性,即a ^ a == 0和操作是可交换和关联的事实,从而导致在每个XOR上应用XOR的解决方案数组元素以获取答案。

function findOdd(arr) {
    return arr.reduce((a,c)=>a ^ c, 0);
}