Given a non-empty 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?
Example 1:
Input: [2,2,1] Output: 1
Example 2:
Input: [4,1,2,1,2] Output: 4
思路:
两种思路,第一种使用set记录出现的数,当该数再次出现时删除;第二种利用异或运算,因为我们知道以下事实:两个相同的数异或为0,任何数与0异或是其本身。
第一种
int singleNumber(vector<int>& nums) {
unordered_set<int> set;
for (int num : nums){
if (set.find(num) == set.end())
set.insert(num);
else set.erase(num);
}
return *set.begin();
}
第二种
int singleNumber2(vector<int>& nums){
int res = 0;
for (int num : nums)
res ^= num;
return res;
}