class Solution {
public:
unsigned long intmax = 2147483647;
vector<int> singleNumber(vector<int>& nums) {
//
// 相同的数亦或的结果是0,不同的数亦或的结果不一样。
// 第一遍遍历得到两个不同的数的亦或。
// 通过 num & (~num + 1) 得到num 的最后一位不同的数,以此来区分在nums数组中哪一位不是A,哪一位不是B.
// 也就是说在nums中如果不让B参与遍历亦或,那么最后得到的结果便是A,同理可以得到B.
// 代码如下.
// 这里是第一轮遍历,得到了nums数组中A Xor B 的值.
int aXorB = 0;
int size = nums.size();
for (int i = 0; i < size; ++i) {
aXorB ^= nums[i];
}
int flag = aXorB & (-aXorB + 1);
// 如果 num 是A或者B里的一个, 则A & flag 和 B & flag 必然是一个为0, 一个是1, 以此来区分A和B.
int A = 0, B = 0;
for (int i = 0; i < size; ++i) {
if (nums[i] & flag) {
// 将那些和flag亦或不为0的项放在一起亦或,这样得到的结果便是那些有两个的数和只有一个的A或者B
A ^= nums[i];
} else {
// 将那些和flag亦或为0的项放在一起亦或,这样得到的结果便是那些有两个的数和只有一个的A或者B
B ^= nums[i];
}
}
vector<int> res;
res.push_back(A);
res.push_back(B);
return res;
}
};
Leetcode Single Number III
挺好的一个思想。Mark一下。