解题思路
要求统计只出现一次的数字,首先想到的是利用对象的key不重复的特点。当存在时,删除当前的key,不存在时,key,value = 1,代码如下
代码
var singleNumber = function(nums) {
const len = nums.length;
let obj = {};
for(let i = 0;i<len;i++){
if(obj[nums[i]]){
delete obj[nums[i]]
}else{
obj[nums[i]] = 1;
}
}
return Object.keys(obj)[0]
console.log('--obj',obj);
};
const nums = [4,1,2,1,2];
console.log(singleNumber(nums));
优化
根据题解,可以使用异或的方式。
对于这道题,可使用异或运算 ⊕。异或运算有以下三个性质。
任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0 =a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a =0。
异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a ) = b ⊕ 0 = b。
因而代码如下:
var singleNumber = function(nums) {
const len = nums.length;
let res = 0;
for(let i = 0;i<len;i++){
res ^= nums[i]
}
return res
console.log('--obj',obj);
};
const nums = [4,1,2,1,2];
console.log(singleNumber(nums));