【问题标题】:Leetcode Single Number II Operator Solution Explanation [closed]Leetcode Single Number II 算子解决方案说明
【发布时间】: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


【解决方案1】:

Hung Thai 在其中一个 cmets 中提到了该方法的粗略概念,但我想进一步详细说明。

变量seen_onceseen_twice 用于存储我们遍历数组时出现的元素的值。如果元素出现一次,则其值存储在seen_once 中,如果出现两次则存储在seen_twice 变量中。如果它出现 3 次,它将不会存储在任何变量中,因为如果我们将一个整数多次传递给函数,(seen_once, seen_twice) 将具有以下值状态:(0,0) -> (n,0) -> (0,n) -> (0,0) -> .... 因此,任何整数都被处理到第三次time 会将变量重置到其初始状态,即(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

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多