Python实现sums函数:单循环查找两列表和为target的索引
问题说明
需要实现名为sums的函数,规则如下:
- 接收3个入参:整数列表
nums1、整数列表nums2、整数target - 返回值为元组
(i,j),其中i是nums1的元素索引,j是nums2的元素索引,满足nums1[i] + nums2[j] = target - 没有符合条件的结果时,返回字符串
Not found - 函数内部仅允许写1个显式循环(for/while均可),禁止嵌套循环
原有代码存在以下问题:
- 函数内部硬编码了测试用的列表和目标值,会覆盖外部传入的参数
- 使用了两层嵌套for循环,不符合单循环要求
- 匹配成功后取的是元素值而非索引,不符合返回要求
- 只有打印逻辑没有返回值,也未处理无匹配的场景
- 函数体未正确缩进,不符合Python语法规范
实现思路
利用Python内置方法构建nums2的「元素值-索引」映射字典(该过程不写显式循环,不占用循环配额),仅用1个for循环遍历nums1:
- 遍历过程中实时计算当前
nums1元素需要匹配的补数(target - 当前元素值) - 判断补数是否存在于
nums2的映射字典中,存在则直接返回对应的索引元组 - 循环结束仍未找到匹配项,返回
Not found
正确代码
def sums(nums1, nums2, target): # 用内置方法生成nums2的值到索引的映射,无手动编写的循环结构 num2_index = dict(zip(nums2, range(len(nums2)))) # 仅1个显式for循环,遍历nums1 for i, num1 in enumerate(nums1): complement = target - num1 if complement in num2_index: return (i, num2_index[complement]) # 循环走完未找到匹配项 return "Not found" # 测试用例 if __name__ == "__main__": nums1 = [11, 2, 15, 7, 8] nums2 = [2, 3, 4, 5] target = 9 print(sums(nums1, nums2, target)) # 输出(3, 0),对应nums1[3]=7、nums2[0]=2,和为9
代码说明
dict(zip(nums2, range(len(nums2)))):通过内置的zip把nums2的元素和对应索引打包,再转成字典,查找时间复杂度为O(1),整个过程没有手动编写循环结构- 仅使用了1个
for循环遍历nums1,完全符合题目循环数量要求 - 找到匹配项直接返回,无多余遍历逻辑
- 兼容无匹配场景,按要求返回对应结果
内容的提问来源于stack exchange,提问作者Shashank Dharba
相关产品推荐
相关产品推荐

