• 面试题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; 
    }
  • 相关阅读:
    关于C#登录三层
    SQL 语句关于分页的写法
    C# 如何去掉button按钮的边框线
    20151220
    继承
    对象的旅行
    多态
    封装
    OO大原则
    javascript
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4624912.html
Copyright © 2020-2023  润新知