问题是'给定一个非空的整数数组,每个元素出现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
答案 0 :(得分:2)
在 Hung Thai 的评论中提到了这种方法的粗略想法,但我想进一步阐述它。
变量seen_once
和seen_twice
用于存储遍历数组时发生的元素的值。如果元素出现一次,则其值存储在seen_once
中;如果元素出现两次,则其值存储在seen_twice
变量中。如果它出现3次,它将不会存储在任何变量中,因为如果我们多次将整数传递给函数,(seen_once, seen_twice)
将具有以下值状态:(0,0) -> (n,0) -> (0,n) -> (0,0) -> ....
因此,任何整数第三次处理后,会将变量重置到其初始状态(0,0)
。因此,遍历整个数组后在seen_once
元素中获得的值将是我们的答案。
让我们接受一个数组:{2, 2, 2, 3}
seen_once = 00, seen_twice == 00
在第一个元素(即2)处,其二进制表示形式为10
。
现在为seen_once will be (~00)&(00^10) = 10 which is 2
的值。
还有seen_twice will be (~10)&(10^10) = 00
的值。
因此,seen_once
之所以存储2,是因为它到目前为止仅发生过一次,并且seen_twice
为0。
进一步遍历时,我们再次得到2,因此seen_twice will become 2
的值到目前为止已经出现过两次,而seen_once will become 0
的值。
然后我们第三次获得 2 。现在,两个变量的值都将变为0。
最后,我们得到 3 ,它仅发生一次,因此将被存储在seen_once
中。
循环结束后,我们得到的答案为seen_once = 3
。