一个数组中其他数都是成对出现的只有一个数是出现一次的,找出这个数。
来源:https://leetcode-cn.com/problems/single-number/solution/
当只有一个数出现一次的时候,可以很方便的运用异或找出这个数
a ^ b ^ c ^ a ^ b
=a ^ a ^ b ^ b ^ c
=0 ^ 0 ^c
=c
class Solution {
public:
int singleNumber(vector<int>& nums) {
int flag=nums[0];
for(int i=1;i<nums.size();i++)
{
flag=flag^nums[i];
}
return flag;
}
};
一个数组中其他数都是成对出现的只有两个数是出现一次的,找出这个两个数。
分析:
当有两个数只出现一次的时候,我们只凭异或是很难得到结果的,所以我们需要将两个数分到两个数组中,再运用上面那题的原理,找到这两个数
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if(data.size()<2)
{
return;
}
int flag=0;
for(int i=0;i<data.size();i++)
{
flag=flag^data[i];
}
int index=0;
while((flag&1)==0)
{
flag=flag>>1;
index++;
}
*num1=0;
*num2=0;
for(int i=0;i<data.size();i++)
{
if(BitIs1(data[i],index))
*num1^=data[i];
else
*num2^=data[i];
}
}
bool BitIs1(int x, int index)
{
x=x>>index;
return x&1;
}
};