找单独的数
题目描述:
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
💡Idea
对其进行Sort排序,然后循环筛选出只有一个的情况即可,代码如下:
def solution(cards):
cards.sort()
from itertools import groupby
for key, group in groupby(cards):
ls = list(group)
if len(ls) == 1:
return ls[0]
💡💡Sort的时间复杂度是多少?
询问豆包AI:
豆包AI:
sort函数在 Python 中使用的是Timsort算法,其时间复杂度为O(n log n),其中 n 是列表的长度。对于这个问题,使用sort函数会导致时间复杂度超过题目要求的 O(n)。
重新思考
-
对原数组循环一遍,设置
dict字典,key记录数字本书,value记录数字出现次数,代码如下:def solution(cards): dt = dict() for i in cards: if i in dt: dt[i] += 1 else: dt[i] = 1 for key, value in dt.items(): if value == 1: return key -
异或
概念:1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
同为假,不同为真题中为只有一个为单独的数,其他数都为两两相同,则代码如下:
def solution(cards): ans = cards[0] for i in range(1, len(cards)): ans ^= cards[i] return ans
Ending ...