题目描述
1)给定一个整数列表,在列表中,从前向后查找两个元素使其相加之和等于目标数,并返回两个整数在列表中的下标。如果没有符合条件的数字,输出False,本题假设题目的解唯一。
2)注意:分两次input()分别读入整数列表和目标数;输出采用列表形式。例如,依次输入整数列表 [2,7,11,15] 和9,输出[0, 1]。
3)输入代码并提交解答。
注意:提交代码时请删除input()函数中的参数,否则会出现错误。
直接暴力(初学者爱用的for循环)
numslist = eval(input())
target = int(input())
flag = 0
for i in range(len(numslist)):
for j in range(i + 1, len(numslist)):
if numslist[i] + numslist[j] == target:
print("[{}, {}]".format(i, j))
flag = 1
if flag == 0:
print("False")
通过了
直接两层for循环一个一个试,直到找到target
进阶(程序员)
numslist = eval(input())
target = int(input())
dic = {}
res = []
for i in range(0,len(numslist)):
n = target - numslist[i]
if n not in dic:
dic[numslist[i]] = i
else:
res = [dic[n],i]
break
if len(res):
print(res)
else:
print("False")
利用字典dic保存数字num。遍历查找数字num与目标数target的“互补数”时只需查找dic[target - num]是否存在即可。
时间复杂度:O(n),因为dic的存取开销为O(1)。
初学者vs程序员
这两段代码是用来寻找数组中两个元素的和等于给定目标值的索引对。
第一段代码使用了嵌套的循环来遍历所有可能的索引对,并判断元素的和是否等于目标值。如果找到了满足条件的索引对,则输出该索引对;如果没有找到,输出"False"。
第二段代码使用了字典来存储已遍历过的元素及其索引。在遍历数组时,每次计算当前元素与目标值之间的差值,并检查差值是否存在于字典中。如果存在,则说明找到了满足条件的索引对,将对应的索引存入结果列表并结束循环。如果遍历完数组后仍未找到满足条件的索引对,则输出"False"。
两段代码的主要区别在于实现的方式不同。第一段代码使用了嵌套的循环,时间复杂度为O(n^2),而第二段代码利用字典的查找特性,时间复杂度为O(n)。因此,第二段代码的效率更高。