解题思路:
第一种就是常规的用哈希表存取的方法,遍历整个数组,然后统计个数,再遍历一遍哈希表,把个数为2的取出来即可,代码如下:
class Solution {
private:
unordered_map<int, int> mp;
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> res;
for(auto& num : nums) {
mp[num] ++;
}
for(auto &[a, b] : mp) {
if(b == 1) {
res.push_back(a);
}
}
return res;
}
};
第二种方法是异或的方法,把所有的数异或完毕剩下的是两个单独的数的异或结果,但是怎么取出来呢,定位其中的一个1,(最小位数1),然后与该数异或结果不同的就能够分出两个单独的数,代码如下:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xornum = 0;
for(auto& num : nums) {
xornum ^= num;
}
// 取最小的1的位
xornum = (xornum == INT_MIN ? xornum : xornum & (-xornum));
int num1 = 0 , num2 = 0;
for(auto& num : nums) {
if(num & xornum) {
num1 ^= num;
} else {
num2 ^= num;
}
}
return {num1, num2};
}
};