【发布时间】:2020-10-12 05:31:12
【问题描述】:
问题是'给定一个非空整数数组,每个元素都出现了 3 次,只有一个元素恰好出现一次。找到那个。' 我想出了一个简单的解决方案,但在网上找到了这个解决方案并且很困惑。有人可以解释一下这段代码吗?或许可以解释一下这些运算符的用途以及我们应该在什么时候使用它们,同时提出一个编码问题的解决方案。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
seen_once = seen_twice = 0
for num in nums:
seen_once = ~seen_twice & (seen_once ^ num)
seen_twice = ~seen_once & (seen_twice ^ num)
return seen_once
【问题讨论】:
-
这种方法的大致思路如下:如果你将一个整数多次传递给函数,
(seen_once, seen_twice)将具有以下值状态:(0,0) -> (n,0) -> (0,n) -> (0,0) -> ...。因此,任何第三次处理的整数都会将变量“重置”为其初始状态,即(0,0)。唯一出现一次的整数k会将(seen_once, seen_twice)的状态移动到(k,0)。(seen_once, seen_twice)可以如上所述转换的解释只是数学,~,&,^分别是按位翻转和异或运算符。 -
一个更容易理解的重要观察是,您可以独立地查看每个位。因此,如果您可以证明这一点,例如最低有效位将正确返回,您可以对所有其他位使用相同的推理 - 证明整个结果是正确的。
标签: algorithm data-structures operators bitwise-operators