这一题最关键的点在于,使用异或之后得到的是两个数的异或结果,如何区分开这两个数呢?
答案是,根据异或结果的一个为1的比特位,就可以把整个数组分为两组,这两组分别含有一个不同的数。在对分别对这两组数进行异或就能提取出唯一数了。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int xor = 0;
for(int i=0;i<array.length;i++){
xor^= array[i];
}
int mask = 1;
while((xor&mask)==0){
mask<<=1;
}
num1[0]=0;
num2[0]=0;
for(int i=0;i<array.length;i++){
if((array[i]&mask)==0){
num1[0] ^= array[i];
}else{
num2[0]^=array[i];
}
}
}
}
网友评论