剑指offer——数组中只出现一次的数字

题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路:采用异或的方法,相同数字异或后结果为0,不同数字异或后结果为1,所以将数组中所有数字异或后的结果就是两个只出现一次的两个数异或的结果(因为相同的数字异或为0,所有出现过两次的数字异或后结果就为0了,抵消了)。得到异或结果以后,找到二进制中最后一个为1的下标记为当前位,然后,对所有数字的二进制按照当前位进行划分,当前位为1的,划分到num1中,当前位为0的,划分到num2中。则最终num1和num2就是两个只出现一次的数字。

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        if(data.empty())
            return ;
        int res=0;//用于统计所有数字异或后的结果
        for(int i=0;i<data.size();i++){
            res^=data[i];
        }
        int BitIndex=0;//查找从后面数第一个“1”
        findBitIndex(res,BitIndex);
        *num1=*num2=0;
        for(int i=0;i<data.size();i++){
            if(isBit(data[i],BitIndex))
                *num1^=data[i];//异或所有BitIndex位为1的数字
            else
                *num2^=data[i];//异或所有BitIndex位为0的数字
        }
    }
    void findBitIndex(int &res,int &BitIndex){
        while(((res&1)==0)&&(BitIndex<8*sizeof(int))){//int型数据的位数长度
            res=res>>1;
            BitIndex++;
        }
    }
    bool isBit(int x,int index){
        x=x>>index;
        return x&1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章