牛客网 数组中只出现一次的数字

class Solution {
    public:  
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
    { 
        if(data.size()<2)  //如果数组只有两个数,肯定就是这两个了
            returnint size=data.size(); 
        int temp=data[0]; 
        for(int i=1;i<size;i++) //这里从第一个数开始做异或,因为相同的数异或之后会抵消掉,
            //如001、001、100,3个数异或之后依然是100,所以我们可以根据这个特性,最后肯定会
            //出现至少有一个1的情况,我们找到最低位的1,那两个不同的数肯定在这个位上不同,一个为1,一个为0
           
            temp=temp^data[i]; 
        if(temp==0)   
            returnint index=0while((temp&1)==0)
        {   
            temp=temp>>1++index;
        } //这里就是找到最低位的1
        *num1=*num2=0for(int i=0;i<size;i++) 
        {   
            if(IsBit(data[i],index))//这里开始分了,如果在这个位上为0则到num1那去异或,否则去num2那里异或 
                *num1^=data[i]; //还是异或,你会发现最后相同的数异或都不见了,只剩下不同的数!!
            else 
                *num2^=data[i]; 
        }   
    }
    bool IsBit(int num,int index) 
    {
        num=num>>index; //这里的函数是判断该数在这个位上是不是1
        return (num&1);
    }
};

 

posted @ 2017-03-30 20:59  爱编程的小羊  阅读(152)  评论(0编辑  收藏  举报