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

题目:一个整形数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。

分析:利用异或运算可以求出一个整形数组里唯一一个只出现一次的数字。因此,如果能将本题的数组分成两个部分,使得每个部分只包含一个只出现一次的数字,便可以求得本题的解。通过从头到尾依次异或数组中的每一个数字,最终得到的结果为两个只出现一次的数字异或得到的结果。由于这两个数字一定不同,因此其异或得到的结果中必定至少有一位为1。假设第n位为1,那么就可以根据第n位是否为1将原数组分成两个部分。

vector<int> findNumsAppearOnce( vector<int>data )
{
    vector<int>result;
    int n = data.size();
    if (n==0)
        return result;
    int temp = 0;
    for (int i = 0; i < n; ++i)
        temp^=data[i];
    //查找temp中第一个1出现的位置
    unsigned int k = 1;
    while ((temp&k)==0)
        k = k << 1;//关系运算符的优先级高于位运算符
    //利用k将data分为两个部分int result1 = 0, result2 = 0;
    for (int i = 0; i < n; ++i)
    {
        if ((data[i]&k) == 0)
            result1^=data[i];
        else
            result2^=data[i];
    }
    result.push_back(result1);
    result.push_back(result2);
        return result; 
}

 

posted @ 2015-07-06 17:29  Rosanne  阅读(214)  评论(0编辑  收藏  举报