返回

在 LeetCode 中找出只出现一次的数字:问题 137、260、142 和 287 的简明解析

闲谈

在编程练习平台 LeetCode 上,查找只出现一次的数字是一个常见且具有挑战性的问题,有多个变体,包括 137、260、142 和 287。解决这些问题需要运用不同的算法和数据结构,可以帮助您提高编程技巧,同时加深对数字操作和数据处理的理解。

在本文中,我们将分别探讨这四个 LeetCode 问题,并提供详细的解决方案和分析。我们将使用 Python 语言来编写代码示例,并对每种算法的时间复杂度和空间复杂度进行分析。

LeetCode 137:只出现一次的数字 II

给定一个只包含整数的数组 nums,其中除一个数字之外的所有数字都出现了三次。找出这个只出现一次的数字。

示例:

输入:[2,2,3,2]
输出:3

算法:位运算

为了解决这个问题,我们可以使用位运算来巧妙地找出只出现一次的数字。具体步骤如下:

  1. 初始化两个变量:ones 和 twos,分别记录数组中只出现一次的数字和出现两次的数字。

  2. 遍历数组中的每个数字 num。

  3. 如果 num 与 ones 相同,则说明它已经出现了两次,因此将 twos 更新为 num。

  4. 如果 num 与 twos 相同,则说明它已经出现了三次,因此将 ones 和 twos 重置为 0。

  5. 如果 num 与 ones 和 twos 都不同,则说明它是只出现一次的数字,将 ones 更新为 num。

  6. 返回 ones。

时间复杂度: O(n),其中 n 是数组 nums 的长度。

空间复杂度: O(1),因为我们只使用了常数个变量。

LeetCode 260:只出现一次的数字 III

给定一个只包含整数的数组 nums,其中除两个数字之外的所有数字都出现了两次。找出这两个只出现一次的数字。

示例:

输入:[1,2,1,3,2,5]
输出:[3,5]

算法:位运算

与 LeetCode 137 类似,我们也可以使用位运算来解决这个问题。具体步骤如下:

  1. 初始化两个变量:xor 和 mask,分别记录数组中所有数字的异或值和只出现一次的数字的异或值。

  2. 遍历数组中的每个数字 num。

  3. 将 xor 更新为 num 与 xor 的异或值。

  4. 如果 xor 的二进制表示中只包含一个 1,则 mask 与 num 的异或值就是只出现一次的数字的异或值。

  5. 将 mask 与 num 的异或值更新为只出现一次的数字。

  6. 返回 mask 和 xor 与 mask 的异或值。

时间复杂度: O(n),其中 n 是数组 nums 的长度。

空间复杂度: O(1),因为我们只使用了常数个变量。

LeetCode 142:环形链表 II

给定一个链表,其中有一个环,找出环的入口节点。

示例:

输入:3 -> 2 -> 0 -> -4 -> 2
输出:2

算法:快慢指针

为了解决这个问题,我们可以使用快慢指针算法。具体步骤如下:

  1. 初始化两个指针:slow 和 fast,分别指向链表的第一个节点。

  2. 遍历链表。

  3. 将 slow 指针移动一步。

  4. 将 fast 指针移动两步。

  5. 如果 fast 指针到达了链表的末尾,则链表中没有环。

  6. 如果 slow 指针和 fast 指针相遇,则链表中存在环。

  7. 将 slow 指针移动到链表的第一个节点。

  8. 将 slow 指针和 fast 指针同时移动一步。

  9. 当 slow 指针和 fast 指针再次相遇时,相遇的节点就是环的入口节点。

  10. 返回相遇的节点。

时间复杂度: O(n),其中 n 是链表的长度。

空间复杂度: O(1),因为我们只使用了常数个变量。

LeetCode 287:寻找重复数

给定一个包含 n 个整数的数组 nums,其中数组中元素的范围在 [0, n-1] 之间,找出数组中重复的数字。

示例:

输入:[1,3,4,2,2]
输出:2

算法:哈希表

为了解决这个问题,我们可以使用哈希表来记录数组中已经出现的数字。具体步骤如下:

  1. 初始化一个哈希表 table,将数组中的每个数字作为键,将其出现的次数作为值。

  2. 遍历数组中的每个数字 num。

  3. 如果 num 在 table 中,则将 table 中 num 的值加一。

  4. 否则,将 num 添加到 table 中,其值设为 1。

  5. 遍历 table 中的每个键值对。

  6. 如果键值对的值大于 1,则键就是重复的数字。

  7. 返回重复的数字。

时间复杂度: O(n),其中 n 是数组 nums 的长度。

空间复杂度: O(n),因为我们使用了哈希表来存储数组中的数字。

总结

在本文中,我们探讨了 LeetCode 上的四个经典问题,分别是 137、260、142 和 287,并提供了详细的解决方案和分析。我们使用了位运算、哈希表和摩尔投票法等算法来解决这些问题,并对每种算法的时间复杂度和空间复杂度进行了分析。希望这些解决方案能对您有所帮助,并启发您在解决其他编程问题时找到更优的解法。