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

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/5

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

解析:
数组中只有一个数字出现一次,其它数字出现两次(偶数次)—异或
数组中只有一个数字出现一次,其它数字出现N次—按位对N取余
数组中有两个数字出现一次,其它数字出现两次(偶数次)—异或,找到这两个数的异或值,然后根据异或值可以将数组分为两类,分别包含这两个数和其它成对的数,继续分组异或即可。

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
    {
        *num1=0;
        *num2=0;
        int n=data.size();
        if(n<2)
            return;
        int xorresult=0,flag=1;
        for(int i=0;i<n;i++)
        {
            xorresult^=data[i];
        }
        while((xorresult&flag)==0)
            flag=flag<<1;
        for(int i=0;i<n;i++)
            if((data[i]&flag)==0)
                *num1^=data[i];
            else
                *num2^=data[i];
    }
};

你可能感兴趣的:(剑指offer—数组中只出现一次的数字)