40.数组中只出现一次的数字
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
解题思路:使用位运算,由于除了两个数字之外的所有数字都出现了偶数次,则将它们进行按位异或,最后得0,最后会得出两个只出现一次数字得异或结果,我们找到结果中倒数第n位为1,即这两个数的倒数第n位一个是-0,一个是1,然后对整个数组按倒数第n位分为两组,对两组数分别进行异或,最终得到两个只出现1次的数字。
public int find(int res)
{
int index=0;
while((res&1)==0&& index<32 )
{
res=res>>1;
index++;
}
return index;
}
public boolean isBst(int target,int index)
{
return ((target>>index)&1)==1;
}
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int res=0;
for(int i=0;i<array.length;i++)
{
res=res^array[i];
}
int index=find(res);
for(int i=0;i<array.length;i++)
{
if(isBst(array[i],index))
{
num1[0]=num1[0]^array[i];
}
else
{
num2[0]=num2[0]^array[i];
}
}
}