如何跳过循环中重复校验,优化查找列表唯一不重复数字的Python函数
问题原因
你当前的实现时间复杂度为O(n²),arr.count(i)本身会遍历全列表统计次数,已经确认重复的数字后续再次被遍历到时,仍然会触发全列表统计,列表越大性能损耗越严重。
优化实现
方案1:哈希表统计(最优通用方案,时间复杂度O(n))
仅需2次遍历即可完成,性能稳定,适合任意规模的列表:
def find_uniq(arr): count_map = {} # 首次遍历统计所有元素出现次数 for num in arr: count_map[num] = count_map.get(num, 0) + 1 # 二次遍历查找唯一出现的元素 for num, cnt in count_map.items(): if cnt == 1: return num
如果可以使用标准库,用collections.Counter写法更简洁,内部做了性能优化:
from collections import Counter def find_uniq(arr): count_map = Counter(arr) for num, cnt in count_map.items(): if cnt == 1: return num
方案2:按要求实现已校验数字跳过逻辑
用集合存储已经确认重复的数字,避免重复统计:
def find_uniq(arr): # 存储已经确认重复的数字 duplicate_nums = set() for num in arr: # 已确认重复的数字直接跳过 if num in duplicate_nums: continue current_cnt = arr.count(num) if current_cnt == 1: return num # 出现次数大于1,加入重复集合后续跳过 duplicate_nums.add(num)
该方案适合列表中不同元素数量较少的场景,性能比原始写法提升明显。
内容的提问来源于stack exchange,提问作者Barbod5412
相关产品推荐
相关产品推荐

