题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
基本思路
首先我们考虑数组中只有一个出现一次的数字,其他的都出现两次,那么可以通过异或的方法,异或全数组结果就是那个只出现一次的数。
现在数组中有两个只出现一次的数,自然就想到把数组分为两个部分,分别有一个数字就可以用上面的方法了。
考虑异或全数组出现两次的数都已经被抵消了,剩下的两个数不一样,那么就肯定异或结果不为 0。所以我们可以找异或结果第一个为1的比特位作为分割数组的标记。出现两次的数标记位肯定是一样的,因此会被分到同一个部分。
具体解法如下:
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if (array == null || array.length < 2) {
return;
}
int xorResult = 0;
for (int i = 0; i < array.length; i++) {
xorResult ^= array[i];
}
// 没有只出现一次的数
if (xorResult == 0) {
return;
}
int flag = 1;
while ((xorResult & flag) == 0) {
flag = flag << 1;
}
num1[0] = 0;
num2[0] = 0;
for (int i = 0; i < array.length; i++) {
if ((array[i] & flag) != 0) {
num1[0] ^= array[i];
} else {
num2[0] ^= array[i];
}
}
}