本题想到了用异或去解 但是中间步骤没想到:
参照大佬解法:
相同的数异或为0,不同的异或为1。0和任何数异或等于这个数本身。
nums = [1,2,10,4,1,4,3,3]
a^a=0
a^0=a
abc=acb
a&(-a)=最低位为1的二进制(从又到左)
所有的异或结果得到sum=2^10=8
flag=-8&8=8
可分为两组,一组为与flag相与等于1的[10],另一组为0的[1,2,4,1,4,3,3]
组内异或分别得到【10】【2】
耗时竟然还这么高
vector<int> singleNumbers(vector<int> &nums)
{
int len = nums.size();
vector<int> res;
if (len < 2)
return res;
int sum = 0;
//得到异或结果,一个数与自己本身异或为0;sum必是两个不同数异或的结果
for (int num : nums)
{
sum ^= num;
}
//得到sum二进制为1的最低位
int flag = (-sum) & sum;
int res1 = 0, res2 = 0;
for (int num : nums)
{
if ((flag & num) == 0)//& 运算优先级低于 ==
{
res1 ^= num;
}
else
{
res2 ^= num;
}
}
res.push_back(res1);
res.push_back(res2);
return res;
}