问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 好的,让我们来逐步完善你的代码。根据题目要求,我们需要找到一个唯一出现一次的数字,并且时间复杂度为 O(n),空间复杂度尽量低。
解题思路
- 理解问题:我们需要找到一个在数组中唯一出现一次的数字。
- 数据结构选择:由于时间复杂度要求为 O(n),我们可以考虑使用位运算来解决这个问题。具体来说,使用异或运算(XOR)可以很好地解决这个问题。
- 算法步骤:
- 初始化一个变量
result为 0。 - 遍历数组中的每一个元素,将
result与当前元素进行异或运算。 - 由于异或运算的性质(相同为0,不同为1),最终
result将会是唯一出现一次的数字。
- 初始化一个变量
代码提示
在你的代码中,我们可以利用异或运算来实现这个功能。以下是代码提示:
def solution(inp):
# 初始化结果变量为0
result = 0
# 遍历数组中的每一个元素
for num in inp:
# 对每一个元素进行异或运算
result ^= num
# 返回最终结果
return result
if __name__ == "__main__":
# 添加你的测试用例
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
print(solution([0, 1, 0, 1, 2]) == 2)
解释
result ^= num:这行代码表示将result与num进行异或运算,并将结果赋值给result。- 由于异或运算的性质,所有出现两次的数字都会相互抵消,最终
result将会是唯一出现一次的数字。 好的,让我们来讨论一下解决这个问题的关键知识点。
关键知识点
-
异或运算(XOR)
- 定义:异或运算是一种位运算,符号为
^。对于两个二进制位,如果相同则为0,不同则为1。 - 性质:
a ^ a = 0:任何数与自身异或的结果为0。a ^ 0 = a:任何数与0异或的结果为该数本身。a ^ b ^ a = b:异或运算满足交换律和结合律。
- 应用:在本题中,利用异或运算的性质,所有出现两次的数字都会相互抵消,最终剩下的就是唯一出现一次的数字。
- 定义:异或运算是一种位运算,符号为
-
时间复杂度
- 定义:时间复杂度是衡量算法执行时间随输入规模增长而变化的一个指标。
- 要求:题目要求时间复杂度为 O(n),即算法需要在一次遍历数组的过程中完成任务。
- 实现:通过一次遍历数组并进行异或运算,可以在 O(n) 时间内找到唯一出现一次的数字。
-
空间复杂度
- 定义:空间复杂度是衡量算法在执行过程中所占用的额外空间随输入规模增长而变化的一个指标。
- 要求:题目要求尽量减少额外空间的使用。
- 实现:通过使用一个变量
result来存储异或运算的结果,空间复杂度为 O(1),即常数空间。
代码中的应用
在你的代码中,这些知识点被应用得非常巧妙:
def solution(inp):
# 初始化结果变量为0
result = 0
# 遍历数组中的每一个元素
for num in inp:
# 对每一个元素进行异或运算
result ^= num
# 返回最终结果
return result
if __name__ == "__main__":
# 添加你的测试用例
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
print(solution([0, 1, 0, 1, 2]) == 2)
- 异或运算:通过
result ^= num,利用异或运算的性质,所有出现两次的数字都会相互抵消,最终result将会是唯一出现一次的数字。 - 时间复杂度:通过一次遍历数组,时间复杂度为 O(n)。
- 空间复杂度:只使用了一个变量
result,空间复杂度为 O(1)。 时间复杂度是衡量算法执行时间随输入规模增长而变化的一个指标。它通常用大O表示法来表示。