题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
/**
* 任何一个数异或它自己都等于0
* 依次异或数组每一个数字,结果就是2个只出现一次的数字的异或结果x,异或结果肯定不为0
* 找到x二进制表示中第一个1的位置index
* 把index = 1的数字分为一组
* 把index = 0的数字分为一组
* 2个只出现一次的数字分在了不同的数组中
*
* @param array
* @param num1
* @param num2
*/
public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
if (array == null || array.length < 2) {
num1[0] = num2[0] = 0;
return;
}
int len = array.length;
int index;
int x = 0;
for (int i = 0; i < len; ++i) {
x ^= array[i];
}
for (index = 0; index < 32; ++index) {
if ((x & (1 << index)) != 0) {
break;
}
}
for (int i = 0; i < len; i++) {
if ((array[i] & (1 << index)) != 0) {
num1[0] ^= array[i];
} else {
num2[0] ^= array[i];
}
}
}