- 主要的点就在于 x ^ (-x) 得到最后一个1的位置
- 利用这两个不同的值的异或值知道有某些位是不一致的,随便找其中的1位(这里为了方便找了最靠近右边的那一位)就可以将这些数字分成两批,两个不同的数字分别出来这两批数据中
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
long long result = 0;
for (auto num: nums) {
result ^= num;
}
result &= (-result);
int res1 = 0;
int res2 = 0;
for (auto num: nums) {
if (num & result) {
res1 ^= num;
} else {
res2 ^= num;
}
}
return vector<int>{res1, res2};
}
};