题目地址

解题思路

要求统计只出现一次的数字,首先想到的是利用对象的key不重复的特点。当存在时,删除当前的key,不存在时,key,value = 1,代码如下

代码

  1. var singleNumber = function(nums) {
  2. const len = nums.length;
  3. let obj = {};
  4. for(let i = 0;i<len;i++){
  5. if(obj[nums[i]]){
  6. delete obj[nums[i]]
  7. }else{
  8. obj[nums[i]] = 1;
  9. }
  10. }
  11. return Object.keys(obj)[0]
  12. console.log('--obj',obj);
  13. };
  14. const nums = [4,1,2,1,2];
  15. console.log(singleNumber(nums));

优化

根据题解,可以使用异或的方式。

对于这道题,可使用异或运算 ⊕。异或运算有以下三个性质。

任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0 =a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a =0。
异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a ) = b ⊕ 0 = b。

因而代码如下:

  1. var singleNumber = function(nums) {
  2. const len = nums.length;
  3. let res = 0;
  4. for(let i = 0;i<len;i++){
  5. res ^= nums[i]
  6. }
  7. return res
  8. console.log('--obj',obj);
  9. };
  10. const nums = [4,1,2,1,2];
  11. console.log(singleNumber(nums));