题中给出一个容器vector<int>,里面除了两个不同的数,其余所有的数都是成对存在,输出要求为一个容器vector<int>,里面为这两个不同的数字。
思路如下,相同的数字按位异或得到0,而不同的数字按位异或得到的数字二进制表示里有1.
于是,先把所有的数字异或一次,得到一个数,因为所求的两个数不相同,所以,二进制表示中1所在的位置就是两个数字不同的位数。找到二进制表示右边开始第一个1的位置。
再从原始vector中,将那个位置为1的数字和不为1的数字分别异或,得到的就是需要的两个数字。
代码如下
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int c=nums[0];
for(int i=1;i<nums.size();i++){
c=c^nums[i];
}
int j=0;
for(;j<32;j++){
if((c>>j)&1) break;
}
int i1=0;
int i2=0;
for(int i=0;i<nums.size();i++){
if((nums[i]>>j)&1==1) i1=i1^nums[i];
else i2=i2^nums[i];
}
vector<int> res;
res.push_back(i1);
res.push_back(i2);
return res;
}
};