解题思路
要求统计只出现一次的数字,首先想到的是利用对象的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 resconsole.log('--obj',obj);};const nums = [4,1,2,1,2];console.log(singleNumber(nums));
