260. 只出现一次的数字 III - 力扣(LeetCode)
根据题目可知:有两个元素只出现一次,其余出现两次。
而在只出现一次的数字 I 里,只有一个元素出现一次,可以用异或的方式直接得到最后的答案,而此题中最后会得到两个不同数字异或后的值x。(a^b=x)
思路:
**1.**从x中获取第一个lowbit为1的位,因为两个数异或某一位结果为1的话,那么这两个数在这一位上的值必定不相同。
**2.**根据这个不相同,把原数组里的所有数分为两组,分别是 :这一位为0和这一位为1,再定义两个变量a b分别异或一组数,a b最终的结果就是两个只出现一次的元素。
注意:用unsigned是因为小心取lowbit溢出问题。
cpp
class Solution {
public:
vector<int> singleNumber(vector<int>& nums)
{
unsigned int j=0;
//最后异或得到的数字
for(int i=0;i<nums.size();i++)
{
j^=nums[i];
}
//k拿到j最低位的1
unsigned int k=j&(-j);
//count是几,就是第几位有不同
int count=0;
while(k!=1)
{
k = k>>1;
count++;
}
int a,b=0;
//分组异或
for(int i=0;i<nums.size();i++)
{
if(((nums[i]>>count)&1)==0)
{
a^=nums[i];
}
else
{
b^=nums[i];
}
}
vector<int> v3;
v3.push_back(a);
v3.push_back(b);
return v3;
}
};