1.分组异或
设这两个数字分别是a和b,由于相同的数字进行异或运算结果为0,则nums数组中所有数字进行异或运算的最终结果=a^b,记这个结果为sum
分组异或:
a和b至少有1bit不相同(在sum的值为1的位上)
两个相同的数,在任一bit都是相同的
取mask=1<<n,使a & mask ≠ b & mask
举例:sum=011,a和b在d1和d0位不相等,则mask=010/001,使a & mask ≠ b & mask
特例:mask=1,那么上述算法就是把奇数分为一组,偶数分为一组
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int sum=0;
for(int num:nums) sum^=num;//所有数字的异或
int mask=1;
while((mask&sum)==0) mask<<=1;//找到一个mask
int a=0;
int b=0;
for(int num:nums){
if((num&mask)==0)//分组
a^=num;
else b^=num;
}
return {a,b};//答案是两组的异或
}
};