HackerRank对所有隐藏的测试用例给出“错误答案”

时间:2019-06-22 13:49:53

标签: python

我正在HackerRank上尝试Project Euler Challenge#2,我的Python代码通过了示例测试用例,但未通过隐藏的测试用例,编译器对所有这些都显示了“错误答案”。这是挑战的链接- https://www.hackerrank.com/contests/projecteuler/challenges/euler002/problem

我犯了什么错误?

我尝试了各种输入(包括巨大的价值和许多测试用例)。当我在PyCharm编辑器中执行它们时,它给了我正确的答案。我想我已经涵盖了所有输入范围。如果没有,请告诉我。

*-jar-with-dependencies.jar

2 个答案:

答案 0 :(得分:0)

您的print(*out,sep='\n')中的问题。您应该循环调用print

尝试一下。所有测试都通过了

#!/bin/python3

import sys


t = int(input().strip())
for a0 in range(t):
    n = int(input().strip())

    if (n < 2) : 
        print(0)
        continue
    # Initialize first two even prime numbers and their sum 
    ef1, ef2 = 0, 2
    sm = ef1 + ef2 

    # calculating sum of even Fibonacci value 
    while ef2 <= n: 
        # get next even value of Fibonacci sequence
        ef3 = 4 * ef2 + ef1 

        # If we go beyond limit, we break loop 
        if ef3 > n: 
            break

        # Move to next even number and update sum
        ef1, ef2 = ef2, ef3
        sm = sm + ef2 

    print(sm) 

enter image description here

答案 1 :(得分:0)

我不确定该答案是否会对将来的读者有所帮助,但是让我们快速阅读一下代码。

让我们尝试其他输入:

3
10
11
12

对于新示例,输出也应为10(8之后的序列中的下一个数字是13):

10
10
10

如果我们使用此输入来运行您的程序,则会得到:

10
None
None

糟糕!看起来像个虫子。无从哪里来?程序初始化时,None填充了输出列表:out=[None]*len(n),因此似乎没有在输出列表中输入正确的值。

其中填充值的行:out[n.index(value)]=sf仅对输入列表中的每个项目一次运行。问题似乎在于,具有相同输出的输入将只计算一次。

我猜您正在尝试通过一次迭代计算所有值来降低运行时复杂性,而不是为每个输入生成Fibonacci序列。太聪明了!

因此,我们注意到具有相同输出值的输入仅更新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:,并且在没有更多值的情况下,我们从passbreak取代了while循环代替。看来,这可以解决第一个问题。现在的输出是我们期望的:

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测试用例。

你是如此亲密,很好!