01 找单独的数

138 阅读1分钟

找单独的数

题目描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

💡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 ...