解题思路
为了找到班级中唯一一个没有配对的数字,我们可以利用异或(XOR)运算的特性。异或运算有以下几个重要的性质:
- 交换律 :
a ^ b = b ^ a - 结合律 :
a ^ (b ^ c) = (a ^ b) ^ c - 自反性 :
a ^ a = 0 - 零元素 :
a ^ 0 = a
基于这些性质,我们可以设计一个算法,通过遍历整个数组,将所有数字进行异或运算。由于相同的数字异或结果为0,而0与任何数字异或结果为该数字本身,因此最终的结果就是那个唯一没有配对的数字。
具体代码
# 初始化一个变量来存储异或运算的结果
unique_number = 0
# 遍历数组中的每一个数字
for card in cards:
# 对当前数字进行异或运算
unique_number ^= card
# 返回最终的异或结果,即为唯一没有配对的数字
return unique_number
# 测试样例
cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
print(find_unique_number(cards)) # 输出: 4
### 详细注释
**函数定义** :
def find_unique_number(cards):
定义一个名为 `find_unique_number` 的函数,参数 `cards` 是一个包含整数的列表。
**初始化变量** :
unique_number = 0
初始化一个变量 `unique_number` 为 0,用于存储异或运算的结果。
**遍历数组** :
1111111
for card in cards:
使用 `for` 循环遍历数组 `cards` 中的每一个元素。
**异或运算** :
unique_number ^= card
对当前遍历到的数字 `card` 进行异或运算,并将结果存储在 `unique_number` 中。由于异或运算的性质,相同的数字异或结果为 0,而 0 与任何数字异或结果为该数字本身。因此,最终 `unique_number` 中存储的就是那个唯一没有配对的数字。
**返回结果** :
return unique_number
返回 `unique_number`,即唯一没有配对的数字。
**测试样例** :
cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
print(find_unique_number(cards)) # 输出: 4
定义一个测试样例 `cards`,并调用 `find_unique_number` 函数,打印出结果。
算法分析
- 时间复杂度 :O(n),其中 n 是数组的长度。我们只需要遍历一次数组,对每个元素进行一次异或运算。
- 空间复杂度 :O(1),我们只使用了常数级别的额外空间来存储一个变量
unique_number。
这个算法充分利用了异或运算的特性,不仅时间复杂度低,而且空间复杂度也非常低,体现了算法的高效性和优化能力。