题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题目分析
这种题目一般使用位运算来计算。
显然这个题目与使用异或运算寻找一个单独数字有异曲同工之妙,只不过这次取异或之后,我们得到的是一个分组标志flag,num&flag=1一组,num&flag=0一组,两组各包含一个单独数字。
java代码
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int[] num11 = new int[array.length];
int[] num22 = new int[array.length];
int temp = 0;
for(int i=0;i<array.length;i++){
temp ^= array[i];
}
System.out.println("temp = " + temp);
int flag = 1;
while(true){
int x = temp&flag;
System.out.println(x);
if(x==0){
flag<<=1;
}else{
break;
}
}
System.out.println("flag = " + flag);
int num1Index = 1;
int num2Index = 1;
for(int i=0;i<array.length;i++){
int x = flag&array[i];
if(x==0){
num11[num1Index++] = array[i];
}else{
num22[num2Index++] = array[i];
}
}
num1[0] = 0;
num2[0] = 0;
for(int i=1;i<num1Index;i++){
num1[0] ^= num11[i];
}
for(int i=1;i<num2Index;i++){
num2[0] ^= num22[i];
}
}