这道题的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;
}
};