zoukankan      html  css  js  c++  java
  • 数组中出现一次的两个数(三个数)& 求最后一位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);  
  • 相关阅读:
    axis2学习笔记
    一个奇怪的数组越界报错
    zk实现分布式锁
    springBoot配置双数据源
    oracle查询
    maven项目打包
    linux修改yum源为阿里云
    kafka入门
    大话设计模式读书笔记(中介者模式)
    大话设计模式读书笔记(职责链模式)
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6445484.html
Copyright © 2011-2022 走看看