zoukankan      html  css  js  c++  java
  • 数据结构练习(41)数组中三个只出现一次的数字

    http://zhedahht.blog.163.com/blog/static/25411174201283084246412/

    思路:

    1. x & (-x)所得的结果即是x最后一位1所在的位置。

    2. x = a ^ b ^ c, f(x) = x & (-x)

    3. f(x^a)^f(x^b)^f(x^c) 结果必有一位是1,因为f(m)^f(n)结果为0或者为2个1

    4. f(x^a)^f(x^b)^f(x^c)的第m位为1,则x^a, x^b, x^c必有1个或者3个第m位为1

    5. 用反证法可得,x^a, x^b, x^c只有一个第m位为1

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int GetLastBit(int n)
    {
        return n & (-n);
    }
    
    void Get3Unique(vector<int>& data, vector<int>& unique)
    {
        if (data.size() < 3)
            return;
    
        int xor = 0;
        vector<int>::const_iterator iter;
    
        for (iter = data.begin(); iter != data.end(); ++iter)
            xor ^= *iter;
    
        int flag = 0;
        for (iter = data.begin(); iter != data.end(); ++iter)
            flag ^= GetLastBit(xor ^ *iter);
    
        flag = GetLastBit(flag);
    
        int first = 0;
        for (iter = data.begin(); iter != data.end(); ++iter)
            if (GetLastBit(*iter ^ xor) == flag)
                first ^= *iter;
    
        xor = 0; 
        for (iter = data.begin(); iter != data.end(); ++iter)
            if (*iter != first)
                xor ^= *iter;
    
        flag = GetLastBit(xor);
        int second = 0, third = 0;
    
        for (iter = data.begin(); iter != data.end(); ++iter)
            if (*iter != first)
            {
                if (*iter & flag)
                    second ^= *iter;
                else
                    third ^= *iter;
            }
        unique.empty();
        unique.push_back(first);
        unique.push_back(second);
        unique.push_back(third);
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    C#将List<T>转化为DataTable
    SqlServer常用内置函数
    C#索引器
    验证Textbox的字符长度
    WM消息对应的Message消息中的Lparam和WParam
    对窗体操作的WM消息
    DllImport使用
    C#获取当前路径的七种方法
    注册ActiveX控件
    [转]VS2010中水晶报表安装应用及实例
  • 原文地址:https://www.cnblogs.com/kedebug/p/2829013.html
Copyright © 2011-2022 走看看