返回

让 LeetCode 137.只出现一次的数字 II 简单一点

闲谈

哈喽大家好,我是你们的算法解题小能手!今天我们一起来看看 LeetCode 137:只出现一次的数字 II。这道题乍一看很复杂,但其实大有玄机。让我带你用有限状态机(finite state machine)轻松解决它。

有限状态机是什么?

有限状态机是一种抽象的计算模型,可以用来表示各种各样的问题。它由有限数量的状态组成,每个状态都有自己的行为和转移条件。当输入改变时,有限状态机会从一个状态转移到另一个状态,并执行相应的行为。

如何用有限状态机解决 LeetCode 137?

第一步,我们需要定义有限状态机的状态。在这道题中,我们可以定义两个状态:

  • 状态 A: 数字只出现一次
  • 状态 B: 数字出现了两次

第二步,我们需要定义有限状态机的行为。对于每个状态,我们需要定义当输入改变时,有限状态机应该做什么。

  • 在状态 A: 如果输入的数字只出现了一次,那么有限状态机保持在状态 A。如果输入的数字出现了两次,那么有限状态机转移到状态 B。
  • 在状态 B: 如果输入的数字出现了三次,那么有限状态机回到状态 A。

第三步,我们需要定义有限状态机的转移条件。也就是,当输入改变时,有限状态机如何从一个状态转移到另一个状态。

  • 从状态 A 到状态 B: 当输入的数字出现了两次
  • 从状态 B 到状态 A: 当输入的数字出现了三次

有了这些定义之后,我们就可以用有限状态机来解决 LeetCode 137 了。具体步骤如下:

  1. 初始化有限状态机,并将当前状态设置为状态 A。
  2. 循环输入数字。
  3. 根据输入的数字,根据有限状态机的定义来更新当前状态。
  4. 重复步骤 2 和 3,直到输入所有数字。
  5. 返回当前状态。

如果当前状态是状态 A,那么只出现一次的数字就是最后一个输入的数字。如果当前状态是状态 B,那么只出现一次的数字就是倒数第二个输入的数字。

怎么样,是不是很简单?只要掌握了有限状态机的概念,LeetCode 137 就不再是难事了。

举个例子

我们来举个例子,看看如何用有限状态机解决 LeetCode 137。假设输入的数字是 [1, 2, 1, 3, 2, 5]。

  1. 初始化有限状态机,并将当前状态设置为状态 A。
  2. 循环输入数字。
  • 输入第一个数字 1,有限状态机保持在状态 A。
  • 输入第二个数字 2,有限状态机转移到状态 B。
  • 输入第三个数字 1,有限状态机回到状态 A。
  • 输入第四个数字 3,有限状态机保持在状态 A。
  • 输入第五个数字 2,有限状态机转移到状态 B。
  • 输入第六个数字 5,有限状态机保持在状态 A。
  1. 重复步骤 2 和 3,直到输入所有数字。

  2. 返回当前状态。

当前状态是状态 A,所以只出现一次的数字是 3。

好了,这就是用有限状态机解决 LeetCode 137 的方法。希望对你有帮助!