面试题:元素为32位整数的数组中只有一个数字出现2次,其余都是出现3次,求这个数

来源:互联网 发布:控制反转和依赖注入php 编辑:程序博客网 时间:2024/05/16 19:55
http://blog.renren.com/blog/944770783/727850263?bfrom=01020340100

以上是原文地址,我加了点注释而已。。

def special(lst):     ones = 0     twos = 0     for x in lst:          twos |= ones & x     #等于保存了之前mod3为2的bit和之前mod3为1的bit加上1之后的bit。          ones ^= x     #等于只保留了出现次数mod3为1的bit。因为之前就是1的bit,再加一个1就是mod3为2了,所以设为0了,若之前为0,再加1就是mod3位1了          not_threes = ~(ones & twos)     #要排除twos中加上一个1后变成mod3为0的bit。ones&twos中为1的bit是之前mod3为2和现在mod3为1的bit,也就是现在mod3为0的值          ones &= not_threes          twos &= not_threes     return twoslst = (1,1,1,4,4)one = special(lst)print one



其中ones记录了所有出现了模3余1次的bit,twos记录的是余2的。not_threes是当一个bit出现第3次的时候,把它清掉。

最后输出ones(如果题目中那个特殊的数出现了1次,当然如果是出现2次的话,应该输出twos。)

因为mod3余1的数,加上mod3余2的数,必然是mod3余0的数。所以 (twos |= ones & x)&(ones ^= x),即代码中的~not_threes = (ones&twos),就是mod3余0的数

原创粉丝点击