等差无序列表缺失元素查找函数异常排查求助
问题分析
你的代码错误在于默认取排序后前两个元素的差作为等差数列的公差,但当缺失的元素恰好位于前两个元素之间时,这个初始公差会是正确公差的2倍,导致后续计算错误。
比如测试用例[2,6,8],排序后为[2,6,8],代码计算的初始公差是6-2=4,而实际正确公差是2。遍历到6和8的差为2,不等于4,就错误地返回6+4=10,而正确缺失的元素是4。
解决方案
要正确计算公差,不能仅依赖前两个元素的差,应该通过以下思路处理:
- 排序列表,确保元素有序;
- 计算所有相邻元素的差值,取这些差值的最大公约数作为正确公差(缺失元素导致的差值是正确公差的整数倍,最大公约数就是原公差);
- 遍历相邻元素,找到差值不等于公差的位置,返回该位置前一个元素加公差;
- 如果所有相邻差值都等于公差,说明缺失的是数列的首项或末项,通过验证原数列应有的元素数量确定具体是哪一个。
修正后的代码:
import math from functools import reduce def gcd(a, b): return math.gcd(a, b) def missing_number(lst): lst.sort() # 计算所有相邻元素的差值 diffs = [lst[i+1] - lst[i] for i in range(len(lst)-1)] # 求所有差值的最大公约数,得到正确公差 diff = reduce(gcd, diffs) # 查找缺失的中间元素 for i in range(len(lst)-1): if lst[i+1] - lst[i] != diff: return lst[i] + diff # 若没有中间缺失,检查首项或末项 expected_count = (lst[-1] - lst[0]) // diff + 1 if expected_count == len(lst): # 缺失的是首项 return lst[0] - diff else: # 缺失的是末项 return lst[-1] + diff
测试验证
- 测试用例1:
missing_number([1,4,2,5])→ 排序后[1,2,4,5],差值为1,2,1,最大公约数是1,找到2和4的差为2≠1,返回2+1=3,符合预期。 - 测试用例2:
missing_number([2,6,8])→ 排序后[2,6,8],差值为4,2,最大公约数是2,找到2和6的差为4≠2,返回2+2=4,符合预期。 - 额外测试缺失首项:
missing_number([4,6,8])→ 返回2,正确。 - 额外测试缺失末项:
missing_number([2,4,6])→ 返回8,正确。
内容的提问来源于stack exchange,提问作者Weronika Basińska
相关产品推荐
相关产品推荐

