我不确定这个答案是否会对未来的读者有所帮助,但让我们快速浏览一下您的代码。
让我们尝试不同的输入:
3
10
11
12
对于新示例,输出也应该是10(8 之后的序列中的下一个数字是 13):
10
10
10
如果我们用这个输入运行你的程序,我们会得到:
10
None
None
哎呀!这看起来像一个错误。无从何来?当程序初始化时,输出列表填充了None:out=[None]*len(n),所以看起来正确的值没有放在输出列表中。
填入值的行:out[n.index(value)]=sf 只对输入列表中的每个项目运行一次。问题似乎是具有相同输出的输入只会被计算一次。
我猜您试图通过在一次迭代中计算所有值来降低运行时复杂性,而不是为每个输入生成斐波那契数列。这很聪明!
因此,我们注意到具有相同输出值的输入只会更新output 中的first 值。如果我们改为对小于f2 的所有值做些什么呢?
t=int(input().rstrip())
n=[]
for i in range(t):
n.append(int(input().rstrip()))
inp=sorted(n)
f1=1
f2=2
sf=2 #sum of fibonacci
it=iter(inp)
value=next(it)
out=[None]*len(n)
maxi=max(inp)
while f2<=maxi:
f1=f1+f2
f2=f1+f2
f1=f2-f1
f2=f2-f1
while f2>value:
out[n.index(value)]=sf
try:
value=next(it)
except StopIteration:
break
if f2%2==0:
sf=sf+f2
print(*out,sep='\n')
只有两件事发生了变化,if f2>value: 现在是 while f2 > value:,当没有更多值时,我们将 break 替换为 while 循环,而不是 pass。这似乎解决了第一个问题。现在的输出是我们预期的:
10
10
10
好的,让我们尝试另一个输入。请记住,它并没有说输入是唯一的。它们可能不止一次出现——如果它们发生了会发生什么?让我们试试这个输入:
2
100
100
输出应该只是44 两次,对吧?使用上面的新版本,我们得到:
44
None
哦,不,另一个错误。问题似乎出在更新输出的线上,再次:out[n.index(value)]=sf。很明显,如果输入类似于[100, 100],则输出应为[44, 44],但n.index(100) 将始终为0。 index 方法将仅返回与值匹配的第一个索引。现在我们有不止一个,这将不起作用。
显然有很多解决方案,但是让我们将答案放在一个名为 results 的字典中,并在我们知道所有输出应该是什么后在最后创建 out:
t=int(input().rstrip())
n=[]
for i in range(t):
n.append(int(input().rstrip()))
inp=sorted(n)
f1=1
f2=2
sf=2 #sum of fibonacci
it=iter(inp)
value=next(it)
results = {}
maxi=max(inp)
while f2<=maxi:
f1=f1+f2
f2=f1+f2
f1=f2-f1
f2=f2-f1
while f2>value:
results[value] = sf
try:
value=next(it)
except StopIteration:
break
if f2%2==0:
sf=sf+f2
out = [results[x] for x in n]
print(*out, sep='\n')
这个也通过了所有的 HackerRank 测试用例。
你离得这么近,真好!