Python3中intersection()函数报错,求解数组首重复元素问题
问题分析与代码修正
首先,你的代码存在几个关键问题,导致运行报错且逻辑不符合题目要求:
1. 集合与列表的混淆
你错误地将set1和set2定义为列表(比如set1=[a]),但变量名却用了set相关的命名,这不仅混淆了数据类型,而且这种赋值逻辑和题目要找重复数字的需求完全无关。
2. 不存在的全局intersection函数
Python中没有全局的intersection函数,集合的交集操作需要通过集合对象的intersection()方法或者&运算符实现,而且你的代码里甚至没有定义b变量,这必然会导致报错。
3. 思路偏离题目要求
你分割数组的逻辑完全无法追踪每个数字的出现位置,题目需要的是找到第二次出现位置索引最小的重复数字,而不是分割数组找交集。
正确解法思路
其实题目要求可以简化为:遍历数组时,第一个遇到的重复数字就是答案——因为它的第二次出现位置是所有重复数字里最早的,后续的重复数字的第二次出现位置肯定更晚。具体步骤:
- 用一个集合记录已经遍历过的数字
- 遍历数组中的每个元素:
- 如果当前元素已经在集合中,直接返回它(这就是我们要找的目标)
- 如果不在,将其加入集合
- 遍历结束后若没有找到重复数字,返回-1
修正后的代码
def firstDuplicate(a): seen = set() for num in a: if num in seen: return num seen.add(num) return -1 # 测试用例验证 print(firstDuplicate([2, 1, 3, 5, 3, 2])) # 输出:3 print(firstDuplicate([2, 4, 3, 5, 1])) # 输出:-1 print(firstDuplicate([2, 3, 3, 1, 5, 2])) # 输出:3
复杂度分析
- 时间复杂度:O(n),每个元素仅遍历一次,集合的查找和添加操作平均时间复杂度为O(1)
- 空间复杂度:O(n),最坏情况下所有元素都不重复,集合需要存储全部元素
这个解法完全满足题目中数组长度≤10^5的性能要求,执行时间远低于4秒的限制。
内容的提问来源于stack exchange,提问作者Salwa
相关产品推荐
相关产品推荐

