题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解法
本题利用异或去解答,详细见代码以及注释:
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array.length == 2){
num1[0] = array[0];
num2[0] = array[1];
return;
}
//将数组进行遍历异或计算
int bitResult = 0;
for(int i = 0; i < array.length; ++i){
bitResult ^= array[i];
}
//将遍历异或计算得到的答案还原成两个结果
//寻找两个数不同的第一位
int index = 0;
while(((bitResult & 1) == 0) && index < 32){
bitResult >>= 1;
index++;
}
//分组还原,以1为界分组,array总数必然为双数,且除两个落单数字外
//均为两个,因此分组后,两组长度必为单数,因此可以得出结果
for(int i = 0; i < array.length; ++i){
if(((array[i] >> index) & 1) == 1){
num1[0] ^= array[i];
}else{
num2[0] ^= array[i];
}
}
}
}