找单独的数题解 | 豆包MarsCode AI刷题

107 阅读2分钟

问题描述

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

要求:

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

题目分析:

题目很好理解,简单来说就是找到计数为1的数值。

大部分人的思维都是直接使用计数的方法进行求解,也就是使用桶排的思想,将各个元素值作为数组的索引来进行计数,在第一次遍历一遍题目给出的数组得到各个数值的计数值之后,再遍历一遍用作桶排的数组得到值为1的索引即为所求,在py中使用字典来实现这个计数。

代码如下:

from collections import Counter

def solution(inp):
    # 统计每个元素出现的次数
    count_dict = Counter(inp)
    
    # 遍历输入数组,返回第一个只出现一次的元素
    for num in inp:
        if count_dict[num] == 1:
            return num
    return -1  # 如果没有只出现一次的元素,返回 -1


if __name__ == "__main__":
    # Add your test cases here

    print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5])) 
    print(solution([0, 1, 0, 1, 2]))

还有一种方法就是,使用排序的方法,首先将传进来的数组里面的数据进行排序,由于数组的长度总是为奇数,所以在排序之后按照步长为2进行遍历,比较前后元素的大小,如果不一致说明当前的元素为所求,还有要注意的是,使用这种方法容易发生越界,在要找的元素在数组最后一位的时候,要加入一个限制条件来进行限制,防止越界。 代码如下:

def solution(inp):
    # Edit your code here
    inp.sort()
    for i in range(0,len(inp),2):
        if i+1==len(inp) or inp[i]!=inp[i+1]:
            return inp[i]

    return 0


if __name__ == "__main__":
    # Add your test cases here

    print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5])) 
    print(solution([0, 1, 0, 1, 2]))

总结

虽然这是一道非常简单的题目,但能通过不同的思路求解也是别有一番乐趣。