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
  • 相关阅读:
    vs2008打开aspx文件时设计界面死机情况的解决
    数据库设计知识点
    JS从样式表取值的函数currentStyle(IE),defaultView(FF)
    Iframe选区
    实用正则表达式(实用篇)
    46.class属性 Walker
    410.锚链接和空链接 Walker
    45.ID属性 Walker
    49.文件下载 Walker
    47.title和style属性 Walker
  • 原文地址:https://www.cnblogs.com/autoria/p/5708504.html
Copyright © 2011-2022 走看看