给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 "no answer"。输出的下标按从小到大排序。用一重循环加字典实现。
输入格式:
在一行中给出这组数。 在下一行输入目标数
输出格式:
在一行中输出这两个数的下标,用一个空格分开。
输入样例1:
在这里给出一组输入。例如:
2,7,11,15
9
输出样例1:
在这里给出相应的输出。例如:
0 1
输入样例2:
在这里给出一组输入。例如:
3,6,9
10
输出样例2:
在这里给出相应的输出。例如:
no answer
看到这题,小编的第一个想法是双层循环,我也觉得这是最简单的,最容易想到的,小编最开始也是没有看到题目中的“一层循环加字典实现”,所以我第一次用的嵌套循环,(PTA判断答案比较死板)答案也是正确的 ,代码如下:
#将输入按“,”分割,并且利用“list”函数转化为列表
a=list(map(int,input().split(',')))
#接收目标数,并且强制转化为整型
b=int(input())
#标记
flag=1
#双层循环
for i in range(0,len(a)):
#flag的一个作用为防止二次输出,利用“break”终止循环
if flag==0:
break
#题目中说两个数字,所以小编觉得j从i+1开始就可以
for j in range(i+1,len(a)):
#判断并且输出
if a[i]+a[j]==b:
print('%d %d'%(i,j))
#利用flag标记,如果有输出的话,下方的语句就不会输出
flag=0
#如果循环中没有输出,我们对flag初值赋值为1
if flag:
print('no answer')
小编后来看到题目的要求就又写了一个用字典实现的代码。
#将输入按“,”分割,并且利用“list”函数转化为列表
a=list(map(int,input().split(',')))
#接收目标数,并且强制转化为整型
b=int(input())
#标记
flag=1
#设置c为字典
c={}
#利用循环将字典c赋值
for i in range(0,len(a)):
#这样赋值可以把列表a中的值赋值给字典的key,而value中我们可以认为存储下标值
c[a[i]]=i
#j只遍历字典中的key,不会遍历字典中的value
for j in c:
#同样,in也只会访问字典中的value
#这就是为什么小编在上一个循环中对字典c那样赋值
if (b-j)in c:
print('%d %d'%(c[j],c[b-j]))
flag=0
#防止二次输出,在输出一次后就利用“break”终止循环
break
#此处用来将没有目标数的结果输出
if flag:
print('no answer')
注:第一个代码的“break”放在大循环那里是有两个循环,如果放在最后则“break”终止的是里面的小循环,外面的大循环还会进行,而放在外面就可以实现输出一次即终止循环,后一个代码没有嵌套循环,所以放在最后“break”发挥作用时就会终止整个循环,从而程序继续向下运行。
关于字典
# 关于字典
dict_1={'a':1,'b':2,'c':3,'d':4,'e':5}
for i in dict_1:
print(i)
print('a'in dict_1)
print(1 in dict_1)
a
b
c
d
e
True
False