欢迎光临
我们一直在努力

5-10两数之和

给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 "no answer"。输出的下标按从小到大排序。用一重循环加字典实现。

输入格式:

在一行中给出这组数。
在下一行输入目标数

输出格式:

在一行中输出这两个数的下标,用一个空格分开。

n=list(map(int,input().split(',')))
m=int(input())
s={}
f=False
for i in range(len(n)):
a=n[i]
b=m-a
if b in s:
print(s[b],i)
f=True
break
s[a]=i
if not f:
print("no answer")

知识点说明
一重循环 只需遍历一次数组,O(n) 时间复杂度
字典(哈希表) 用 s[a] = i 存值->下标,查找 O(1)
查找逻辑 对当前数 a,查所需数 b = m – a 是否在字典中
输出顺序 字典里存的下标一定更小,直接先输出它,再输出当前 i
唯一解 找到第一个就 break,保证唯一

题目要求运用一重循环加字典实现,上面的代码正是如此,不过我还写了一段用两重循环进行的代码.

n=list(map(int,input().split(',')))
m=int(input())
f=False
for i in range(len(n)):
for j in range(i+1,len(n)):
if n[i]+n[j]==m:
print(i,j)
f=True
break
if not f:
print("no answer")

还有这种方法:

n=list(map(int,input().split(',')))
m=int(input())
s={}
f=False
for i,a in enumerate(n):
b=m-a
if b in s:
print(s[b],i)
f=True
break
s[a]=i
if not f:
print("no answer")

一重循环 只需遍历一次数组,O(n) 时间复杂度
字典查找 O(1) 用哈希表快速判断需要的数是否出现过
enumerate 简洁 同时拿下标和值,不用写 range(len(n))
自动保证顺序 字典里存的下标一定比当前小,输出自然从小到大
找到即停 题目保证解唯一,找到第一个就 break
代码短小清晰 逻辑集中,没有冗余

 

赞(0)
未经允许不得转载:171主机测评 » 5-10两数之和
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址