题目笔记:寻找唯一独特数字
题目描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
方法介绍
1. 异或运算(XOR)
-
原理:异或运算是一种位运算,具有以下特性:
a ^ a = 0:任何数与自身异或的结果为0。a ^ 0 = a:任何数与0异或的结果为它本身。- 异或运算满足交换律和结合律,即
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b。
-
应用:在本题中,我们可以利用异或运算的这些特性来找到那个唯一的独特数字。具体步骤如下:
- 初始化一个变量
unique_number为0。 - 遍历数组中的每一个数字,对每个数字进行异或运算。
- 最终
unique_number中存储的就是那个唯一的独特数字。
- 初始化一个变量
代码实现
def solution(cards):
# 初始化一个变量来存储异或结果
unique_number = 0
# 遍历数组中的每一个数字
for card in cards:
# 对每一个数字进行异或运算
unique_number ^= card
# 返回最终的异或结果,即那个唯一的独特数字
return unique_number
if __name__ == "__main__":
# 添加你的测试用例
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
print(solution([0, 1, 0, 1, 2]) == 2)
print(solution([7, 3, 3, 7, 10]) == 10)
心得体会
1. 位运算的巧妙应用
- 通过使用异或运算,我们能够在不使用额外空间的情况下,以线性时间复杂度(O(n))解决这个问题。这体现了位运算在处理特定问题时的强大能力。
2. 时间复杂度与空间复杂度的权衡
- 题目要求尽量减少额外空间的使用,这促使我们思考如何在不增加空间复杂度的情况下解决问题。异或运算正好满足了这一要求,因为它只需要一个额外的变量来存储结果。
3. 代码简洁性与可读性
- 使用异或运算的代码非常简洁,易于理解和维护。这提醒我们在编写代码时,应尽量选择简洁且高效的解决方案,而不是复杂且冗长的代码。
4. 测试用例的重要性
- 在编写代码后,添加测试用例来验证代码的正确性是非常重要的。通过测试用例,我们可以确保代码在各种情况下都能正确运行。
总结
通过本题的练习,我们不仅学会了如何使用异或运算来解决特定问题,还体会到了时间复杂度与空间复杂度之间的权衡,以及代码简洁性与可读性的重要性。这些经验对于我们今后的编程实践具有重要的指导意义。