面试题40:数组中只出现一次的数字

2019-03-26  本文已影响0人  liuqinh2s

这一题最关键的点在于,使用异或之后得到的是两个数的异或结果,如何区分开这两个数呢?
答案是,根据异或结果的一个为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];
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读