方法一:查表
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
map<int, int> record;
vector<int> result;
for(int i = 0; i < nums.size(); i++)
{
record[nums[i]]++;
}
for(auto ele : record)
{
if( ele.second == 1)
result.push_back(ele.first);
}
return result;
}
};
方法二:异或
1.找到sum中第一位为1的数,可以知道这个结果是两个只出现一次的a和b异或的结果。
我们可以把两个数区分为两部分 所有数中这一位为1的数,所有数中这一位为0的值
这样我们再次遍历所有的数,把所有这一位为1的数进行异或就可以得到这个数这一位为1的数
同理得到这一位为0的数
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int sum = 0;
for( int num : nums )
{
sum ^= num;
}
//找到sum中第一位为1的数,我们可以把两个数区分为两部分 所有数中这一位为1的数,这样我们再次遍历所有的数,把所有这一位为这个数的进行异或就可以得到这个数
//另外一个数是这一位为0的值,我们把零另外分组里面的数取出来了
int flag = 1;
// while( ( sum & flag ) == 0 )
// flag << 1;
flag = sum & (-sum);
vector<int> result(2,0);
for( int num : nums )
{
if( (flag & num) == 0)
{
result[0] ^= num;
}
else
{
result[1] ^= num;
}
}
return result;
}
};