zoukankan      html  css  js  c++  java
  • 大数去重

    题目如下:一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?

    参考:http://blog.csdn.net/Dinosoft/article/details/6443354

        def special(lst):  
            ones = 0  
            twos = 0  
            for x in lst:  
                twos |= ones & x  
                ones ^= x  
                not_threes = ~( ones & twos )  
                ones &= not_threes  
                twos &= not_threes  
            return twos 

    其中ones记录了所有出现了(模3余1)次的bit,twos记录的是余2的。not_threes是当一个bit出现第3次的时候,bit位置0

    在代码中,ones ^= x 执行后,如果ones的一个bit等于1,说明这个bit=1的情况出现了1, 3, 5...奇数次,在本题中只会取1, 3。

    twos |= ones & x ,其中的ones & x确定了这一轮会得到的余2的bit(从ones中加x来到twos),而原来的twos中有的bit会变成余0(加上x中对应的bit离开twos),有的保持余2(x中没对应的bit),所以先统统算进是余2的部分。

    ones ^= x得到的是加上x后出现1或3次的bit。

    (ones & twos)得到的就是      (出现1或3次的bit) & (余2或余0的bit) = 出现3次的bit

    ~(ones & twos),作为掩码置0。

    另一种写法

    (one, two) = (0, 0)
    for num in nums:
        one = (one ^ num) & ~two
        two = (two ^ num) & ~one
    print two
  • 相关阅读:
    Oracle基础操作
    Linux的常用命令
    Javascript 上课笔记
    Linux操作指令
    css样式分类
    DW
    标准sql执行顺序
    Mysql数据库
    模拟课----需求文本
    php 发送邮件
  • 原文地址:https://www.cnblogs.com/autoria/p/5708504.html
Copyright © 2011-2022 走看看