例题解析:利用异或运算(XOR)找出单独的数
异或运算(XOR)
异或运算是一种位运算,通常用符号 ^
表示。它的运算规则如下:
- 如果两个二进制位相同,结果为
0
。 - 如果两个二进制位不同,结果为
1
。
具体来说,对于两个二进制位 a
和 b
,异或运算的结果如下:
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
异或运算的特性
- 交换律:
a ^ b = b ^ a
- 结合律:
(a ^ b) ^ c = a ^ (b ^ c)
- 自反性:
a ^ a = 0
- 与零的异或:
a ^ 0 = a
--------------------------------------------以下是题目----------------------------
题目 :问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例1:
输入:
cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。
样例2:
输入:
cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。
完整的代码
def solution(cards):
# 初始化一个变量来存储异或的结果
result = 0
# 遍历数组中的每一个元素
for card in cards:
# 对每一个元素进行异或运算
result ^= card
# 返回最终的结果
return result
if __name__ == "__main__":
# 添加你的测试用例
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) )
print(solution([0, 1, 0, 1, 2]))
print(solution([7, 3, 3, 7, 10]))
解释
result = 0
:初始化一个变量result
为 0,用于存储异或运算的结果。for card in cards
:遍历数组中的每一个元素。result ^= card
:对每一个元素进行异或运算,并将结果存储在result
中。return result
:返回最终的结果,即唯一出现一次的数字。
这个代码可以正确地找到数组中唯一出现一次的数字,并且满足题目要求的时间复杂度 O(n) 和空间复杂度 O(1)。
如果你有任何问题或需要进一步的帮助,请告诉我!