剑指offer56-1
// 使用unordered_set插入和删除元素,最后仅出现过一次的元素被保留到哈希表中
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
unordered_set<int> res;
int len = nums.size();
for(int i=0;i<len;i++){
if(res.count(nums[i]))
res.erase(nums[i]);
else
res.insert(nums[i]);
}
vector<int> v;
for(auto cur:res)
v.push_back(cur);
return v;
}
};
// 先一遍异或得到这两个只出现一次的元素的异或值div
// 一个while循环得到异或值二进制表示的首位1,即div
// 再遍历一遍,以该位是否为1将数组元素分成两组,分别异或,得到a,b即为所求
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int ret = 0;
for (int n : nums)
ret ^= n;
int div = 1;
while ((div & ret) == 0)
div <<= 1;
int a = 0, b = 0;
for (int n : nums)
if (div & n)
a ^= n;
else
b ^= n;
return vector<int>{a, b};
}
};