剑指offer——数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
在位运算中的异或 ^ 可以将两个相等的数组消去,而在这一题目中,有两个不相等的数字,所以他们之间至少有一位不同,
含有1(如5和2 1001 0010)异或之后的结果是1011,在数组中,按照1的位置这一结果的不同,
将这些数分为两份,一份是第一位为1的,另外一份是为0的,
其中那两个不一样的数字会因为这个而分开,进而可以用异或来求出
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int len = array.length;
int num = array[0];
for(int i = 1; i < len; i++){
num ^= array[i];
}
int flag = 1;
while(num != 0){
if((num & flag) == 0) flag = flag << 1;
else break;
}
num1[0] = num2[0] = num;
for(int i = 0; i < len; i++){
if((array[i] & flag) == 0){
num1[0] ^= array[i];
} else{
num2[0] ^= array[i];
}
}
}
}

浙公网安备 33010602011771号