关于第一道题,找单独的数
不使用额外空间的解法需要使用异或XOR操作
# 初始化一个变量来存储异或的结果
result = 0
# 遍历列表中的每一个数字
for card in cards:
# 将当前数字与结果变量进行异或操作
result ^= card
# 返回结果变量,这个变量现在存储的就是唯一的数字
return result
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
print(solution([0, 1, 0, 1, 2]) == 2)
为何可行,可以从异或运算的性质证明。
根据菜鸟教程位运算(&、|、^、~、>>、 | 菜鸟教程。
摘录异或运算的性质可得
性质:
- 交换律
- 结合律:
(a ^ b) ^ c == a ^ (b ^ c) - 对于任何数
x,都有x ^ x = 0,x ^ 0 = x - 自反性:
a ^ b ^ b = a ^ 0 = a
我们可以从自反性得出,可以抵消掉偶数次出现的相同的数字,只留下奇数次出现的数字。