Question:
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
给定一个整数数组,其中数组内的所有数据元素(除了一个以外)都出现2次,找到这个出现一次的数据;
要求时间复杂度为O(n),空间复杂度为O(1)
可以知道,如果数组为空,返回0;
若不为空,可以采用位异或运算;
异或运算介绍:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
如果A = 2,B=3 则A^B = 010 ^ 011 = 001;
所以如果从第一个元素开始到最后一个元素采用异或运算,遇到相同的数据元素会中和为0,最后只会剩下出现1次的数据无法被中和为0;
所以代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for (int n : nums)
res ^= n;
return res;
}
};