问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。 尽量减少额外空间的使用,以体现你的算法优化能力。
问题解析
这个问题是一个经典的查找单次出现元素的问题,也被称为“寻找异数”问题。在这个问题中,除了一个数字外,其他数字都恰好出现了两次。我们需要找出那个只出现一次的数字。
思路与图解
思路是使用一个哈希表(字典)来记录每个数字出现的次数。由于除了一个数字外,其他数字都出现了两次,我们可以通过遍历数组,对于每个数字,如果它在哈希表中已经存在,就将其计数加一;如果不存在,就将其加入哈希表并设置计数为1。最后,遍历哈希表,找到计数为1的数字,即为所求。
解析如下:
1.初始化一个空哈希表 p。
2.遍历输入数组 inp:
-如果 num 在 p 中,p[num] 加一。
-如果 num 不在 p 中,将 num 添加到 p 中,并设置 p[num] 为1。
3. 再次遍历哈希表 p:
-如果找到 v == 1 的键值对,返回 k 作为结果。
4.如果没有找到计数为1的数字,返回 -1。
代码内容:
def solution(inp):
# 初始化一个空字典p,用于存储数组中每个数字出现的次数。
p = {}
# 遍历输入列表inp中的每个数字。
for num in inp:
# 如果数字num已经在字典p中,则将其对应的次数加1。
if num in p:
p[num] += 1
# 如果数字num不在字典p中,则将其添加到字典p中,并设置次数为1。
else:
p[num] = 1
# 再次遍历字典p中的每个键值对。
for k, v in p.items():
# 如果找到次数为1的数字,则返回这个数字。
if v == 1:
return k
# 如果没有找到次数为1的数字(理论上不会出现这种情况,因为题目保证了一定有一个数字只出现一次),则返回-1。
return -1
if __name__ == "__main__":
# 在这里添加测试用例。
# 测试用例1:数组中包含数字1, 1, 2, 2, 3, 3, 4, 5, 5,其中数字4只出现一次。
# 预期输出应该是4,因为4是唯一一个只出现一次的数字。
print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
# 测试用例2:数组中包含数字0, 1, 0, 1, 2,其中数字2只出现一次。
# 预期输出应该是2,因为2是唯一一个只出现一次的数字。
print(solution([0, 1, 0, 1, 2]) == 2)
新知识点总结
1.哈希表的应用:哈希表(字典)是一种高效的数据结构,用于存储键值对,可以快速查找、插入和删除元素。
2.时间复杂度和空间复杂度:这个问题的时间复杂度为 O(n),因为我们只需要遍历一次数组。空间复杂度为 O(n),因为在最坏的情况下,我们需要存储所有不同的数字。
学习建议
对于入门同学来说,理解哈希表的工作原理和应用场景是非常重要的。可以通过解决类似的算法问题来加深理解。同时,要注意算法的时间复杂度和空间复杂度,这在解决大规模数据问题时尤为重要。 AI 刷题功能可以帮助你快速理解问题和解决方案,但要深入学习,还需要结合其他资源。例如,可以通过在线课程学习数据结构和算法的基础知识,通过LeetCode等平台练习算法题,以及阅读相关书籍来加深理解。同时,可以加入技术社区,与其他学习者交流心得,共同进步。
学习建议
理论与实践相结合:通过AI刷题功能理解算法后,尝试自己实现代码,加深理解。多参与社区交流。