260. 只出现一次的数字 III
思路:先将数组中所有的元素进行异或,最后得到的结果sum一定是两个单独值的异或结果,也就是说这个sum!=0,二进制形式一定存在1,而这个1就代表两个单独值不同的地方。那么我们就找到sum最小位置上的1所形成的数mask=sum&(-sum),再用这个数去和数组中的所有元素进行“与”操作,两个相同数一定会在一边,而两个单独值一定会在对立面。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
long long sum=0;//注意这里要用long long
for(int i=0;i<nums.size();i++){
sum^=nums[i];
}
//避免在这里找最小1的时候溢出
//例如,当sum=-2^31时,-sum=2^31,那就超过了int的范围
int mask=sum&(-sum);
vector<int > v(2,0);
for(auto tmp:nums){
if(mask&tmp){
v[0]^=tmp;
}else{
v[1]^=tmp;
}
}
return v;
}
};