
- 连marscode第一题都不会做的你打开了题目解析
- 有人相爱,有人夜里开车看海,有人marscode第一题都做不出来。
- abandon
问题分析
这道题目要求我们从一个数组中找到唯一不重复的数字卡片,其他数字均出现两次。这类问题在算法设计中被归类为 "找单一元素" 的问题,尤其强调了时间复杂度和空间复杂度的优化:
- 时间复杂度要求:O(n)。
- 空间复杂度要求:尽可能减少额外的空间开销。
解题思路
首先想到的就是哈希表,只要遍历两次就可以了。
哈希表
利用哈希表统计每个数字出现的次数:
- 遍历数组时,将数字作为键,出现次数作为值记录在哈希表中;
- 遍历完成后,检查哈希表,找到值为1的键,即为所求。
这种方法的时间复杂度为 O(n),因为只需要遍历数组一次,同时哈希表的插入和查询操作平均时间复杂度为 O(1)。
但空间复杂度为 O(n),因为需要额外存储所有的键值对,不符合题目中"尽量减少额外空间"的要求。
不过其实还有一个更高效的方法------异或
位运算:异或操作
一种巧妙且高效的方法是利用 异或运算 (XOR) 的性质:
- a⊕a=0:相同的数字异或后为0;
- a⊕0=a:任意数字与0异或仍为它本身;
- 异或运算满足交换律和结合律:a⊕b⊕a=(a⊕a)⊕b=0⊕b=b。
基于上述性质,题目中数组中的所有成对数字会两两抵消,只剩下唯一的单一数字。因此,通过对数组中的每个数字依次进行异或操作,最终结果就是我们要找的独特数字。
算法步骤:
- 初始化一个变量
unique_number = 0
; - 遍历数组
cards
,将每个数字依次异或到unique_number
上; - 遍历结束后,
unique_number
就是结果。
代码实现:
arduino
def solution(cards):
unique_number = 0
for card in cards:
unique_number ^= card
return unique_number
时间复杂度:O(n) ------ 只需遍历一次数组。
空间复杂度:O(1) ------ 只使用了一个额外变量 unique_number
。
总结

方法 | 时间复杂度 | 空间复杂度 | 备注 |
---|---|---|---|
哈希表 | O(n) | O(n) | 高效,但空间开销较大 |
异或操作 | O(n) | O(1) | 高效,最优解法 |
利用异或运算的性质,这道题可以在时间复杂度 O(n) 和空间复杂度 O(1) 下解决,展现了算法设计中巧用数学性质的魅力。