我正在执行此任务,我需要找到一个恰好在数组中出现奇数次的数字。
我相信我已经差不多完成了,但是如果某个数字连续出现多次(例如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
。该函数始终返回第一个数字,该数字恰好等于数组的下一个元素。
答案 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);
}