Lintcode84 Single Number |||solution 题解

【题目描述】

Given2*n + 2numbers, every numbers occurs twice except two, find them.

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。

【题目链接】

www.lintcode.com/en/problem/single-number-iii/

【题目解析】

不妨设最后两个只出现一次的数分别为x1, x2. 那么遍历数组时根据两两异或的方法可得最后的结果为x1 ^ x2, 如果我们要分别求得x1和x2, 我们可以根据x1 ^ x2 ^ x1 = x2求得x2, 同理可得x_1. 那么问题来了,如何得到x1和x2呢?看起来似乎是个死循环。

这道题的巧妙之处在于利用x1 ^ x2的结果对原数组进行了分组,进而将x1和x2分开了。具体方法则是利用了x1 ^ x2不为0的特性,如果x1 ^ x2不为0,那么x1 ^ x2的结果必然存在某一二进制位不为0(即为1),我们不妨将最低位的1提取出来,由于在这一二进制位上x1和x2必然相异,即x1,x2中相应位一个为0,另一个为1,所以我们可以利用这个最低位的1将x1和x2分开。又由于除了x1和x2之外其他数都是成对出现,故与最低位的1异或时一定会抵消。

【参考答案】

www.jiuzhang.com/solutions/single-number-iii/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (转自http://www.douban.com/group/topic/14820131/,转自人大论坛) 调整...
    f382b3d9bdb3阅读 10,832评论 0 8
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 来源: http://www.douban.com/group/topic/14820131/ 调整变量格式: f...
    MC1229阅读 6,964评论 0 5
  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 1,184评论 0 0
  • “鸟人”是我们几个战友对另外一个战友的称呼,而且只是其中一个外号,其他还有什么:“公公”、“大群猪”等等;因为他...
    漂哥阅读 469评论 2 5