题意:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
解法:遇到重复数字出现要想到异或,A^A = 0 , 0 ^ A= A ,我们把数组异或完,得到的是tot = num1 ^ num2 , 那么如何将他们区分开呢? 找出tot的二进制下,最左边的1的位置idx,那么这个1必定由其中的一个num提供。因此把idx位置为1的数都异或起来,最终得到的是num1。 idx为0的位置异或,最终得到的是num2
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array==null || array.length == 0)
return;
int tot = 0;
for (int item : array) {
tot ^= item;
}
int idx = 0;
while ((tot&1)==0){
tot = (tot >> 1);
idx++;
}
for (int item : array) {
if(bit(item,idx))
num1[0] ^= item;
else num2[0] ^= item;
}
}
boolean bit(int num,int idx) {
return ((num>>idx) &1) == 1;
}