Python列表三数之和函数语义错误求助:返回结果不符合预期
排查sum_tri函数的语义错误:为什么测试用例返回False?
我一眼就看到了问题所在——你的函数过早返回了False,导致根本没机会检查到符合条件的三元组!
核心问题分析
看你的代码:
def sum_tri(a, x): for i in range(len(a) - 1): for j in range(i, len(a)): for k in range(j, len(a)): if a[i] + a[j] + a[k] == x: return True else: return False
在第一次进入三层循环时,比如你的测试用例里i=0, j=0, k=0,计算的是1+1+1=3,不等于103,这时else分支直接触发return False,函数直接终止了!后面的5、8、90这些元素的组合根本没机会被检查到。
简单说:你只检查了第一个可能的三元组,不符合就直接放弃了,完全没遍历完所有可能的组合。
修正后的代码
把return False移到所有循环的外面,只有当遍历完所有三元组都没找到符合条件的,才返回False:
def sum_tri(a, x): # 遍历所有i<=j<=k的三元组组合(允许重复使用同一位置元素) for i in range(len(a)): for j in range(i, len(a)): for k in range(j, len(a)): if a[i] + a[j] + a[k] == x: return True # 所有组合都检查完毕,没有符合条件的才返回False return False
如果你的需求是只能使用数组中不同位置的元素(即i<j<k,不重复使用同一个元素),可以优化循环范围减少冗余检查:
def sum_tri(a, x): n = len(a) for i in range(n - 2): for j in range(i + 1, n - 1): for k in range(j + 1, n): if a[i] + a[j] + a[k] == x: return True return False
测试验证
调用sum_tri([1, 5, 8, 2, 6, 55, 90], 103)时,修正后的函数会找到5+8+90=103这个组合,正确返回True。
进阶优化(可选)
当前的三重循环时间复杂度是O(n³),如果数组规模较大,效率会很低。可以先对数组排序,然后用双指针法把时间复杂度降到O(n²),比如:
def sum_tri(a, x): a.sort() n = len(a) for i in range(n - 2): left = i + 1 right = n - 1 while left < right: current_sum = a[i] + a[left] + a[right] if current_sum == x: return True elif current_sum < x: left += 1 else: right -= 1 return False
这个版本效率更高,适合处理大数组。
内容的提问来源于stack exchange,提问作者user9258239
相关产品推荐
相关产品推荐

