问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
题目分析:
题目很好理解,简单来说就是找到计数为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]))
总结
虽然这是一道非常简单的题目,但能通过不同的思路求解也是别有一番乐趣。