
解題思路:
第一種就是常規的用哈希表存取的方法,遍歷整個陣列,然后統計個數,再遍歷一遍哈希表,把個數為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};
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342127.html
標籤:其他
