Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找数组中出现奇数次的int_Javascript - Fatal编程技术网

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

Javascript 查找数组中出现奇数次的int,javascript,Javascript,问题是找到数组中出现奇数时间的整数 例如:[1,1,1,1,1,1,10,1,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,1,1,1,1,10,1,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;
}

您的代码失败是因为在迭代数组时检查奇数,所以每次它发现任何新数字时都会覆盖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;
}
由于同一个值可能会再次出现,您过早地将其指定给topKey

下面是一个解决方案,它在每次出现时向集合添加/从集合中移除一个值,如切换,然后从剩余集合中获取第一个值:

函数getOddarr{ 对于arr.reduceset的v,v=>set.deletev?set:set.addv,new set 返回v; } var arr=[5,4,3,2,1,5,4,3,2,10,10]; 结果=getOddarr;
console.logresult;将console.logitem放在if语句中应该可以解释这个问题。我检查了您的解决方案,但在某些情况下失败了。例:[1,1,2,-2,5,2,4,4,-1,-2,5]应该返回-1。感谢您的帮助,我想我是通过在计数后迭代解决的。我数完后加了这一行。对于keyCounts{if keyCounts[odd]%2{topKey=odd;}}@markchen555中的奇数,您可以在该if中返回奇数,以避免在找到匹配项后测试剩余的数字,并且我已修复错误-我在Object.keys中有一个,而不是counts@markchen555注意:您自己的代码将返回找到的数字的字符串版本。我的答案中的+字符串| | undefined用于确保返回数值,如果没有找到匹配项,则返回undefined