136. Single Number

这道题的tag是Bit Manipulation,意为位操作,说实话,我是完全没接触过这种解法的,我用了map做的,时间复杂度应该是O(n),但是因为用了map,空间复杂度是不符合题目要求的,题目要求不使用额外的空间。

这道题是用按位异或操作实现的,首先我们来复习一下什么叫异或操作。
异或的意思是相异为1,相同为0。

例如x = 2, y = 1,则x^y = 3。我们先把x和y化成2进制的。
2: 1 0
1: 0 1

1 1
得到的11化为10进制是3。

异或操作有以下性质:
1、交换律 x^y == y^x
2、结合律 (xy)z == x(yz)
3、对于任何数x,都有xx=0,x0=x
4、自反性 xyy == x^0 == x

其实从第4条性质我们就能看出来这道题如何解,因为x和任何两个相同的数进行异或操作后就等于x本身。所以想到这里代码自然很简单了

class Solution {
public:
    int singleNumber(vector<int>& nums) {        
        int res = 0;
        for(auto e : nums) res ^= e;        
        return res;
    }
};
posted @ 2021-01-06 17:38  nullxjx  阅读(79)  评论(0编辑  收藏  举报