您的位置:首页 > 职场人生

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

2013-11-22 15:18 501 查看
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 twos
lst = (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的数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐