题意理解
给出一个无序数组,有两个不同的数只出现一次,其他数都出现两次,求这两个不同的数。
问题分析
用异或来做,全部异或之后,结果就是两个不同的数异或的结果。对这个结果保留最后一个1,然后拿这个1的结果来过滤整个数组,过滤的方法是如果元素与这个结果为0就编为一组,不为0就是另一组,这样的两组一定是将两个不同的数分割开来了。
其他
链接
vector<int> singleNumber(vector<int>& nums) {
int sign=0;
for(auto num : nums) { //计算两个不同的数相异或的结果
sign=sign^num;
}
sign=sign & (-sign); //解析出异或结果最后一个1的位置,这个1的位置取值区分出了两个相异的数
vector<int> res(2,0);
for(auto num : nums) { //过滤分成两拨
if((num & sign) == 0) { //如果当前数和这个1与完结果为0
res[0]=res[0]^num;
}
else { //当前数和这个1与完结果不为0
res[1]=res[1]^num;
}
}
return res;
}