【LeetCode】-- 260. Single Number III

问题描述:

  https://leetcode.com/problems/single-number-iii/

  在一个数组里面,只有两个元素仅出现过1次,其余都出现过两次。找出出现仅一次的那两个(a, b)。

要求常量空间,线性时间。

问题解决:

  这题用到“神奇的位运算”。

  1.因为除了特殊的两个元素,其余两两出现,那么就想到了XOR(异或)。

  2.从头到尾XOR之后,会得到a xor b 的结果。接下来我们试着把这两个元素分离开来。

  3.我们在a xor b 中找到任意一位XOR[diff_pos] = 1 , 那么可知在diff_pos这位上a 和 b 是不一样的。如果按照diff_pos这位的值

  分类可以将所有数分成两组: 1)diff_pos = 0的元素, 2)diff_pos = 1的元素。

  4.对3中的两组分别组内xor,因为其余元素都是 两两出现,那么最后就剩下a / b 了。

代码如下:

class Solution(object):
    def singleNumber(self, nums):
        xor = 0
        for num in nums:
            xor = xor^num
        diff_pos = 0
        for i in range(31):
            if(xor & (1 << i)):
                diff_pos = i
                break
        rec = [0,0]
        for num in nums:
            if(num & (1 << diff_pos)):
                rec[1] ^= num
            else:
                rec[0] ^= num
        return rec

  论文还没看,又在瞎搞了。。。

找最右边的1比特位确实有更好的方法:

xor = xor & ~(xor - 1);

 

posted on 2016-06-10 17:10  暴力的轮胎  阅读(171)  评论(0编辑  收藏  举报

导航