我在HackerRank上尝试projecteuler Challenge#2,我的Python代码通过了示例测试用例,但是没有通过隐藏的测试用例,编译器显示所有测试用例的“错误答案”。以下是挑战的链接- https://www.hackerrank.com/contests/projecteuler/challenges/euler002/problem
我犯了什么错误?在
我尝试过各种输入(包括巨大的值和许多测试用例)。当我在PyCharm编辑器中执行它们时,它给了我正确的答案。我想我已经涵盖了所有的输入。如果没有,请告诉我。在
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
if f2>value:
out[n.index(value)]=sf
try:
value=next(it)
except StopIteration:
pass
if f2%2==0:
sf=sf+f2
print(*out,sep='\n')
您的
print(*out,sep='\n')
中的问题。您应该在循环中调用print
试试这个。所有测试通过
我不确定这个答案是否有助于将来的读者,但是让我们快速浏览一下您的代码。在
让我们尝试不同的输入:
对于新的示例,输出也应该是
^{pr2}$10
(8之后的序列中的下一个数字是13):如果我们用这个输入运行程序,我们得到:
哎呀!看起来像个虫子。什么都不是从哪里来的?当程序初始化时,
None
将填充输出列表:out=[None]*len(n)
,因此似乎没有将正确的值放入输出列表中。在填充值的行:
out[n.index(value)]=sf
只对输入列表中的每个项目运行一次。问题似乎是具有相同输出的输入只计算一次。在我猜您是想通过在一次迭代中计算所有值来降低运行时复杂性,而不是为每个输入生成Fibonacci序列。太聪明了!在
因此,我们注意到具有相同输出值的输入只更新^{中的第一个值。如果我们对小于
f2
的所有值进行处理,会怎么样?在只有两件事改变了,}当没有更多的值时,我们}循环。这似乎解决了第一个问题。现在的输出是我们预期的:
^{pr2}$if f2>value:
现在是while f2 > value:
,而不是{break
退出{好的,让我们尝试另一个输入。记住,它并没有说输入是唯一的。它们可能不止一次发生-如果发生会发生什么?让我们试试这个输入:
输出应该是
44
两次,对吗?通过以上新版本,我们得到:哦不,又是一只虫子。问题似乎出在更新输出的行上:
out[n.index(value)]=sf
。很明显,如果输入是[100, 100]
,那么输出应该是[44, 44]
,但是n.index(100)
总是0
。index方法只返回与值匹配的第一个索引。现在我们有一个以上的,这是行不通的。在显然有很多解决方法,但是让我们把答案放在一个名为
results
的字典中,并在最后创建out
,一旦我们知道所有的输出应该是什么:这个测试也通过了所有的HackerRank测试用例。在
你很亲密,真好!在
相关问题 更多 >
编程相关推荐