摘要: 如果你还没有看过上一篇文章,请先移步看问题描述。扩展问题二:至多扫描一遍序列,求出丢失的两个数字。不管用什么方法,可以肯定的是我们至少需要扫描一遍序列。因为只能扫描一遍,所以先求出 a XOR b,再根据结果分类的方法就不适用了。既然我们不能根据某一位分类,那我们能否对所有位进行分类呢?比如,int是32位,我们可以对每一位都分成两类分别异或。我们还要记录每一位上1出现的次数,实际上,只需要记录1出现奇数次还是偶数次就够了。如果某一位上1出现奇数次,那么我们就知道 a 和 b 在此位上的比特不同。从而利用前面分类异或的结果就直接得出答案。Python 代码:deffind_missing_2_ 阅读全文
posted @ 2012-04-24 16:53 shilcare 阅读(1415) 评论(1) 推荐(1)
摘要: 这是一个有趣的面试题。有一个袋子,里面放有1,2,3,...,100,共100个整数,且每个数字只出现一次。现在由于袋子破了个洞,造成其中一个数字丢失了。请找出丢失的数字。很容易想到的方法是:我们可以用减法,1+2+...+100的和减去袋子中所有数的和,其差就是丢失的那个数字。1 + 2 + ... + 100可以由等差数列公式100*(1+ 100)/2 = 5050算出,我们只需要遍历一次袋子中的数字即可。把这道题推广到一般情况:设π是{1, 2, ... , n}的一个全排列,π-1是π 中丢失了一个数字后的序列。找出序列π-1中缺失的数字。当n比较小时,我们仍可以用上面的方法,但是当 阅读全文
posted @ 2012-04-24 14:56 shilcare 阅读(3210) 评论(8) 推荐(3)