面试题:元素为32位整数的数组中只有一个数字出现2次,其余都是出现3次,求这个数
2013-11-22 15:18
501 查看
http://blog.renren.com/blog/944770783/727850263?bfrom=01020340100
以上是原文地址,我加了点注释而已。。
其中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的数
以上是原文地址,我加了点注释而已。。
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的数
相关文章推荐
- 一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
- 一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)
- 一个整型数组中,只有两个数字只出现了一次,其余都是成对出现的,输出这两个数。
- 一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字(数组指针的方法)
- 一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字
- 一组数据中只有一个数字出现了一次和 一组数据中只有两个个数字出现了一次其他所有数字都是成对出现的。请找出这个数字
- 整数数组,一个数字出现了半数以上次,找出这个数字
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- C语言:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 一个数字出现2次外,其余的数字都出现了3次
- 每天一道LeetCode-----一个整数序列,每个元素出现两次,只有一个(两个)出现一次,找到这个(这两个)元素
- 一个数组,有一个数出现3次,其余出现2次,求出现3次的数,要求时间复杂度<nlogn,空间复杂度O(1)
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)
- 一道位运算的题目,一串数字,别的都出现了3次只有一个出现2次,要你找到他
- 3.有一个整形数组,只有一个数字出现了一次,请编写程序判断这个数字(大概题目就是这样的,记不太清了)