问题背景 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。要求设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数,并且尽量减少额外空间的使用。 解题思路
- 理解问题 首先,我们需要理解问题的核心:在一个整数列表中,除了一个数字外,其他数字都出现了两次。我们需要找出那个只出现一次的数字。
- 数据结构的选择 由于题目要求时间复杂度为 O(n),并且尽量减少额外空间的使用,我们可以考虑使用异或(XOR)运算。异或运算有以下几个重要的特性: a ^ a = 0:任何数与自身异或的结果为 0。 a ^ 0 = a:任何数与 0 异或的结果为该数本身。 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b。
- 算法步骤 基于异或运算的特性,我们可以设计如下算法: 初始化一个变量 result 为 0:这是为了确保任何数与 0 异或的结果为该数本身。 遍历列表中的每个数字:对每个数字进行异或运算。 返回 result:最终的 result 就是那个只出现一次的数字。 代码实现 python def solution(cards): # 初始化一个变量来存储异或结 果 result = 0 # 遍历列表中的每个数字,并进 行异或运算 for card in cards: result ^= card # 异 或运算 # 返回最终结果 return resultif name == "main": # 测试用例 print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4) print(solution([0, 1, 0, 1, 2]) == 2)
代码解释 初始化 result 为 0:这是为了确保任何数与 0 异或的结果为该数本身。 遍历列表中的每个数字:对每个数字进行异或运算。 返回 result:最终的 result 就是那个只出现一次的数字。 测试用例 在 main 函数中,我们添加了两个测试用例来验证代码的正确性: solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4:这个测试用例中,数字 4 是唯一一个没有配对的数字。 solution([0, 1, 0, 1, 2]) == 2:这个测试用例中,数字 2 是唯一一个没有配对的数字。 总结 通过利用异或运算的特性,我们可以在 O(n) 的时间复杂度内解决这个问题,并且不需要额外的空间。这种方法不仅高效,而且代码简洁易懂。通过这个问题的解决,我们可以更好地理解异或运算的应用,以及如何在实际问题中利用其特性来优化算法。 希望这篇伴学笔记能帮助你更好地理解问题并掌握解决方法!如果你有任何问题,欢迎继续提问。