我们知道N^ N=0;假设数组中A和B只出现一次,那么数组异或之和sum=A^B。转换成二进制,A与B肯定在某一位不同,一个为0,一个为1,我们以这一位来划分数组为0派和1派,0派和1派的异或和分别为A和B。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int l=array.length;
int sum=0;
for(int i=0;i<l;i++){
sum^=array[i];
}
int m=1;
while((m&sum)==0){
m=m<<1;
}
for(int i=0;i<l;i++){
if((array[i]&m)!=0){
num1[0]^=array[i];
}
else{
num2[0]^=array[i];
}
}
}
}