Skip to content

230814 Non Repeating Numbers

【题意】: 数组中只有两个数字不成对,找出这两个数字

【 Excepted 】:

  • Time Complexity: O(N)
  • Space Complexity: O(1)

和数字有关,同时所需的空间复杂度极小,这个时候应该从二进制入手。

异或运算的一个特性:相同数字进行异或会等于零。

Python3

py
class Solution:
	def singleNumber(self, nums):
	    xor = 0
	    for n in nums:
	        xor ^= n
	    mostRight = xor & (~xor + 1)
	    a = 0
	    for n in nums:
	        if n & mostRight == 0: # 注意这里要么是 0,要么是 mostRight
	            a ^= n
	    return sorted([a, a ^ xor])

【我+评论区 SC: O(1)】

py
class Solution:
	def singleNumber(self, nums):
	    aXORb = 0
	    for n in nums:
	        aXORb ^= n
        # 通过 divideFlag 来将 a 和 b 区分开。这个值不一定得是最右侧的第一个 1, 只要是任意位置上的一个 1 就可以
	    # 下面代码等同于 divideFlag = aXORb & ~(aXORb - 1)
        divideFlag = 1
	    while aXORb & 1 != 1:
	        aXORb >>= 1
	        divideFlag <<= 1

	    a, b = 0, 0
	    for n in nums:
            # 通过与 divideFlag 求异或,我们能够保证 a 和 b 会分别进入不同的分支。至于其他的数字,由于他们是成对的,所以最后都会被消掉。
	        if (n & divideFlag) == divideFlag:
	            a ^= n
	        else:
	            b ^= n
	    return sorted([a, b])

【我的 SC: O(N)】

py
class Solution:
	def singleNumber(self, nums):
		once = set()
		for n in nums:
	        if n in once:
		        once.remove(n)
	        else:
	            once.add(n)
	    ans = [*once]
	    ans.sort()
		return ans