【问题标题】:HackerRank gives 'Wrong Answer' for all hidden test casesHackerRank 对所有隐藏的测试用例给出“错误答案”
【发布时间】:2019-06-22 23:22:03
【问题描述】:

我在 HackerRank 上尝试 Project Euler 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')

【问题讨论】:

    标签: python


    【解决方案1】:

    我不确定这个答案是否会对未来的读者有所帮助,但让我们快速浏览一下您的代码。

    让我们尝试不同的输入:

    3
    10
    11
    12
    

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

    10
    10
    10
    

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

    10
    None
    None
    

    哎呀!这看起来像一个错误。无从何来?当程序初始化时,输出列表填充了Noneout=[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&gt;value: 现在是 while f2 &gt; 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 测试用例。

    你离得这么近,真好!

    【讨论】:

      【解决方案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) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-06
        • 2019-01-29
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        • 2014-11-19
        相关资源
        最近更新 更多