📅  最后修改于: 2023-12-03 15:07:08.639000             🧑  作者: Mango
有一个JavaScript数组,其中某些值出现了奇数次,而其他值则出现了偶数次。我们需要编写一段代码,找出这些出现了奇数次的值。
最简单的方法是使用JavaScript对象来统计每个值出现的次数。首先创建一个空对象来存储每个值的出现次数,然后遍历数组并递增每个值的计数器。最后再遍历一遍对象,找到值为奇数次的键值。
function findOddValues(arr) {
const count = {};
for (const val of arr) {
count[val] = (count[val] || 0) + 1;
}
const oddVals = [];
for (const key in count) {
if (count[key] % 2 !== 0) {
oddVals.push(Number(key));
}
}
return oddVals;
}
const arr = [1, 2, 3, 2, 1, 3, 4];
const oddVals = findOddValues(arr);
console.log(oddVals); // [4]
在此代码中,我们首先创建一个名为“ count”的空对象,用于跟踪每个值的出现次数。我们然后遍历数组并通过增加每个值在“ count”对象中的计数器来记录每个值的出现次数。
在第二个循环中,我们遍历每个键,并检查其值是否为奇数次。如果是,则将该键值转换为数字并添加到“ oddVals”数组中。这样一来,我们就可以获得出现奇数次的值的清单。
第二种方法是在维护一个长度为2的数组来和操作,这个数组的第一个值存储当前已经找到的只出现了奇数次的值的异或值,第二个值存储当前已经找到的只出现了一次的值。
在遍历数组的时候,每个值都和数组中的第一个值异或,如果出现了偶数次的数字,它们会被抵消掉,仅仅剩下那些只出现了奇数次的值。这种方法的复杂度为O(n)。
function findOddValues(arr) {
let a = 0, b = 0;
for (const val of arr) {
a ^= val; // 只出现奇数次的值的异或值
b |= (b ^= val) & val; // 只出现一次的值
}
return [a ^ b, b].filter(val => val !== 0);
}
const arr = [1, 2, 3, 2, 1, 3, 4];
const oddVals = findOddValues(arr);
console.log(oddVals); // [4]
在这段代码中,我们首先初始化两个变量:a和b。变量“a”将存储仅出现奇数次的值的异或值,而变量“b”将存储仅出现一次的值。我们然后遍历数组并异或值“a”,然后更新“b”以仅包含仅出现一次的值。
最后,我们就可以从这两个变量中确定仅出现奇数次的值。如果这个清单只有一个元素,我们就返回它。如果它有多个元素,我们就返回这个数组。