剑指 Offer 56 - I. 数组中数字出现的次数
解题思路:
算法流程:
- 全部异或,然后相同为0,不同为1,最后得到的结果就是两个不同数的异或结果ans。
- 将异或结果位于1判断哪位为1,根据异或为1的那位将nums中的数分为此位为1和此位为0的两部分。
- 然后两部分分别异或得到不同的数。
- 将两数加入列表res,返回结果列表res。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
if(nums.size() == 0)
return {};
vector<int> res;
int ans = 0;
int anum = 0;
int bnum = 0;
int h = 1;
for(int n : nums)
ans ^= n;
while((h & ans) == 0)
h <<= 1;
for(int n:nums)
if(n & h)
anum ^= n;
else
bnum ^= n;
res.push_back(anum);
res.push_back(bnum);
return res;
}
};