LeetCode-- 260. Single Number III

Posted 暴力的轮胎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

以上是关于LeetCode-- 260. Single Number III的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode-260-Single Number III]

LeetCode OJ 260Single Number III

leetcode260. Single Number III

[LeetCode] 260. Single Number III(位运算)

LeetCode-- 260. Single Number III

[LeetCode] 260. Single Number III 单独数 III