题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
要找出出现一次的数字需要对数组进行异或
若只有一个出现一次的数字,那么异或的结果就为这个数字。
有两个出现一次的数字,则异或的结果就是这两个出现一次的数字异或的结果。
找出这个结果中找到一位不为0的位
把数组分为2组,将这位为1的数字进行异或,和这位不为1的数字进行异或,得到的结果就是最终结果
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int res = array[0];
for(int i = 1; i < array.length;i++){
res = res ^ array[i];
}
int index = 0;
for(int i = 0;i < 32;i++){
if((res >> i & 1) == 1){
index = i;
break;
}
}
for(int i = 0; i < array.length;i++){
if((array[i] >> index & 1) == 1){
num1[0] = num1[0] ^ array[i];
}else num2[0] = num2[0] ^ array[i];
}
}
}