Javascript 查找数组中出现奇数次的int
问题是找到数组中出现奇数时间的整数 例如:[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 我的代码通过了所有的测试,除了这两个。我不知道为什么有人能解释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]
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