题目:
260. 只出现一次的数字 III - 力扣(LeetCode)
思路:
[1,2,3,3]
eor = 1^2^3^3 = 1^2 = 3
eor的二进制位中,第一位为1,说明1,2的二进制的第一位不一样
用eor异或数组中第一位二进制为1数(将1和2分开了)
异或的结果就是1和2中的其中一个
再用eor异或那个结果,得到另一个为奇数个数的数
代码:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums)
{
vector<int> ret;
int eor = 0;
for (auto e : nums)
{
eor ^= e;
}
//int rightOne = eor==INT_MIN ? INT_MIN : eor & (~eor+1);
int rightOne = 1;
int temp = eor & rightOne;
while (temp == 0)
{
rightOne <<= 1;
temp = eor & rightOne;
}
int _eor = eor;
for (auto e : nums)
{
if ((e & rightOne) != 0)
{
_eor ^= e;
}
}
ret.push_back(_eor);
ret.push_back(eor^_eor);
return ret;
}
};