• 数组中出现一次的两个数(三个数)& 求最后一位bit为1


    对于两个数,对于结果中,剩余bit1来异或区分。

    下面的解法,非常精简:

    int lastBitOf1(int number)
    {
        return number & ~(number - 1);
    }
     
    void getTwoUnique(vector<int>::iterator begin, vector<int>::iterator end, vector<int>& unique)
    {
        int xorResult = 0;
        for(vector<int>::iterator iter = begin; iter != end; ++iter)
            xorResult ^= *iter;
       
        int diff = lastBitOf1(xorResult);
       
        int first = 0;
        int second = 0;
       
        for(vector<int>::iterator iter = begin; iter != end; ++iter)
        {
            if(diff & *iter)
                first ^= *iter;
            else
                second ^= *iter;
        }
       
        unique.push_back(first);
        unique.push_back(second);
    }

    对于有三个数的情况,复杂一些:

    要用到异或结果跟所有数异或的最后一位,再异或。如下:

    http://blog.csdn.net/sunmenggmail/article/details/8035008

    1. for(iter = numbers.begin(); iter != numbers.end(); ++iter)  
    2.         flags ^= lastBitOf1(xorResult ^ *iter);  
    3.     flags = lastBitOf1(flags);  
  • 相关阅读:
    逆序数———线段树/树状数组
    线段树 模板
    博弈论--对称博弈
    matlab程序设计
    matlab矩阵的操作
    2nd 历年学生作品评论(3部)
    1st 四人小组项目
    1st 本周工作量及进度统计
    1st 结对编程:简易四则运算
    1st 英文文章词频统计
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6445484.html
Copyright © 2020-2023  润新知