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

2024-05-19 22:10:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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')

Tags: 答案inputvalue错误测试用例itsfout
2条回答

您的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

我不确定这个答案是否有助于将来的读者,但是让我们快速浏览一下您的代码。在

让我们尝试不同的输入:

3
10
11
12

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

^{pr2}$

如果我们用这个输入运行程序,我们得到:

10
None
None

哎呀!看起来像个虫子。什么都不是从哪里来的?当程序初始化时,None将填充输出列表:out=[None]*len(n),因此似乎没有将正确的值放入输出列表中。在

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

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

因此,我们注意到具有相同输出值的输入只更新^{中的第一个值。如果我们对小于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退出{}循环。这似乎解决了第一个问题。现在的输出是我们预期的:

^{pr2}$

好的,让我们尝试另一个输入。记住,它并没有说输入是唯一的。它们可能不止一次发生-如果发生会发生什么?让我们试试这个输入:

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

你很亲密,真好!在

相关问题 更多 >