//一个数组里面的所有的数字出现两次,只有一个数只出现一次,找出这个数
void FindUniqueNum(vector<int> p,int num)
{
num = 0;
for(int i = 0;i<p.size();i++)
num^=p[i];
}
//一个数组里面的其余的数出现两次,有两个不同的数出现一次,找出这两个数
void FindTwoUniqueNum(vector<int> p,int &num1,int &num2)
{
if(p.size()<2)
{
num1=0;
num2=0;
return;
}
int a = 0,index=1;
for(int i = 0;i<p.size();i++)
a^=p[i];
while(a&(index)==0)
index<<=1;
for(int i=0;i<p.size();i++)
{
if((p[i]&index)==0)
num1^=p[i];
else
num2^=p[i];
}
}
//一个数组里面其余的数出现三次,找出只出现一次的数
int FindUniqueNumFromAllThree(vector<int> p)
{
int ones=0,twos=0,threes=0;
for(int i=0;i<p.size();i++)
{
twos |=ones&p[i];
ones ^=p[i];
threes =~(ones&twos);
ones &= threes;
twos &= threes;
}
return ones;
}