LeetCode 136 只出现一次的数字

一个寻常的思路是建立一个二位数组rec,val分量用于储存出现的数字的值,cnt分量用于储存他出现的次数,然后遍历一遍数组,对于数组中的每个元素,如果rec中有这个数,就把cnt++,没有就创建一个,把cnt置为1;最后遍历一遍数组rec,返回cnt值为1的val。该算法代码量较大,空间复杂度为O(n),时间复杂度为O(n^2),emmmm,垃圾算法

冥思苦想了好半天我终于想到了神奇的位操作----异或(exclusive or),该操作具有以下性质(以C语言中的异或运算符代表异或符号)

  • 0^0=0
  • 0^1=1
  • 1^0=1
  • 1^1=0

总结起来就是

  • 0^a=a
  • a^a=0

  异或具有交换律和结合律

将我们要返回的值ans初始为0,然后遍历数组,相同的数异或后得0,0与要求的数结合得它本身,所以最后ans的值就是只出现了一次的数,代码如下

int singleNumber(vector<int>& nums) {
        int len=nums.size(),ans=0;
        for(int i=0;i<len;i++) ans^=nums[i];
        return ans;
    }

猜你喜欢

转载自blog.csdn.net/Accsc/article/details/80335284