题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题目:
本题主要考察的是异或,两个相同数异或的结果为0。这道题的低级版本是求除一个数字之外的所有数都是两个数字。根据异或的这一特性,我们将数组所有元素进行异或,那么结果就是单独的那个数。
现在我们需要得到两个数字,首先两个不同数字的异或结果肯定不为0。那么我们将所有元素异或后,得到的结果就是两个数异或的结果。我们如何找到两个数的不同点呢?
根据异或的特性,我们找到其异或结果最低位的1,那么这两个元素此二进制位,肯定有一个为1,有一个为0。 接下来我们根据此二进制位是否为1将数组元素分为两个集合,两个要得到的元素在不同的集合中,相同的元素其肯定会分到同一个集合中。因此将这两个集合元素分别异或就会得到要求的的两个数。
代码实现:
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int num=0;
for(int i=0;i<array.length;i++){
num=num^array[i];
}
int n=1;
while((num&n)==0){
n=n<<1;
}
int n1=0;
int n2=0;
for(int j=0;j<array.length;j++){
if((array[j]&n)==0){
n1^=array[j];
}else{
n2^=array[j];
}
}
num1[0]=n1;
num2[0]=n2;
}
}