Leetcode单数II运算符解决方案说明

时间:2020-06-22 11:04:49

标签: algorithm data-structures operators bitwise-operators

问题是'给定一个非空的整数数组,每个元素出现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

1 个答案:

答案 0 :(得分:2)

Hung Thai 的评论中提到了这种方法的粗略想法,但我想进一步阐述它。

变量seen_onceseen_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