题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路分析:
该题想考的是位操作,我们分析如果数组中只有一个数字出现一次,其他数字都出现了两次,那么我们可以将数组中的元素异或最后的得到的值就是出现一次的数,因为相同数异或为0,所以很自然的最后的结果就是出现一次的数。那么我们首要任务就是将数组分成两个各自只包含一个只出现一次的数的数组。我们将数组中的元素进行异或,那么最终的结果一定是两个只出现一次数的异或结果。我们找到这个结果二进制中最低位的1的位置,就能在数组中将这两个数分开。
代码:
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int myxor=0;
int flag=1;
for(int i=0;i<array.length;i++){
myxor=myxor^array[i];
}
while((myxor & flag)==0){
flag<<=1; //找到第一个1的位置
}
for(int j=0;j<array.length;j++){
if((array[j]&flag)==0){
num1[0]=num1[0]^array[j];
}else{
num2[0]=num2[0]^array[j];
}
}
}
}