【问题标题】:Day 8 Hackerrank Python of 30 Days of Code - Dictionaries and Maps第 8 天 Hackerrank Python 的 30 天代码 - 字典和地图
【发布时间】:2020-06-09 22:22:51
【问题描述】:

谁能弄清楚为什么我在 Python Hackerrank 30 Days of Challenge 中的这个练习的代码没有通过测试用例 1?

这是挑战:

目标 今天,我们正在学习使用 Map 或 Dictionary 数据结构的键值对映射。查看教程标签以获取学习材料和教学视频!

任务 给定姓名和电话号码,组装一个电话簿,将朋友的姓名映射到他们各自的电话号码。然后,您将获得未知数量的姓名来查询您的电话簿。对于每个查询,将电话簿中的相关条目以 name=phoneNumber 形式打印在新行上;如果找不到条目,​​则打印 Not found 。

注意:您的电话簿应该是 Dictionary/Map/HashMap 数据结构。

输入格式

第一行包含一个整数,表示电话簿中的条目数。 随后的每一行都以单行上的空格分隔值的形式描述了一个条目。第一个值是朋友的名字,第二个值是一个 -digit 电话号码。

在电话簿条目的行之后,有未知数量的查询行。每行(查询)都包含一个要查找的内容,您必须继续阅读行,直到没有更多输入为止。

注意:名称由小写英文字母组成,仅是名字。

输出格式

每次查询换行,如果姓名在电话簿中没有对应条目,则打印未找到;否则,请以 name=phoneNumber 格式打印完整信息。

这是我的代码:

    n = int(input())

    phone_book = {}

    for i in range(n):
        name, phone_num = map(str,input().split())
        name = name.lower()
        phone_book[name] = phone_num

    queries = 0

    while queries in range(n):
        query = input().lower()
        if query in phone_book:
            print(query + "=" + phone_book.get(query))
        else:
            print("Not found")

        queries += 1

对于这个测试用例 1:

100000
unayklejwm 53561825
ahiff 57272140
frlrecdfxo 28001354
aeccxyrbek 21112785
mlgdk 12405837
iyiyycfngr 23841264
subnwvrqdp 77688226
vhypdqfbdy 67846211
lcnbh 86026675
lxbjpmuhis 85475547
enfifbprov 20172436
hnjctgslxf 18125412
slfoglbvah 47530087
mpsrcmrkon 44365224
jnpslqvlkx 88071512
liwyjbsfkk 50646067
kyrkhaikuf 18535535
ubvfx 43551151
krger 80787433{-truncated-}

我得到的错误不是输出错误,而是:

编译器消息:

Runtime Error

预期输出

Not found
ipwpabdefa=14170412
Not found
toykmviqbo=11872347
mooetebtqt=70658483
fbubawkkhq=10613664
Not found
ejqxn=77321147
Not found
Not found
Not found
Not found
xgfpx=58118174
Not found
odacddldrk=73267266
Not found
iakxugylkc=41875647
Not found
djtelththc=20278224
Not found{-truncated-}

这仅发生在第一个测试用例中,但其他用例成功通过。

编辑:我刚刚再次运行了所有测试用例,这次我根据结果通过了所有测试用例。但是,即使我通过了所有测试用例,我仍然会遇到运行时错误。它给了我这个:

Runtime Error :(

出现此错误是否有原因?我应该如何修复我的代码?

欢迎提出任何建议。

【问题讨论】:

  • 你需要edit在这里发布实际的问题陈述,而不是期望人们去Hackerrank。没有它,就没有足够的关于代码应该做什么的细节。它读取 100000 个输入并将其存储在一个字典中,......然后传递给下一个 query = input().lower() 调用的是什么?另外,请注意您在循环外调用了 query = input().lower(),然后在内部再次调用,有效地跳过了第一个输入。
  • 好的,我添加了问题并修改了我的代码,但我仍然得到相同的运行时错误(即使我一次通过了所有测试用例)。
  • 挑战说:“查询的行数未知。和“你必须继续阅读行,直到没有更多的输入 “。但是,您似乎期待n 查询(while queries in range(n))。我认为n 应该只是电话簿条目的数量。
  • @Gino Mempin 有没有办法解决这个问题?如果有未知数量的测试用例,据我所知,它可能会无穷无尽。但是根据问题有一个限制。 n 和查询数都有 10^5 的约束。即使我通过了所有测试用例,问题仍然是运行时错误。
  • 另外,当您手动测试时:要输入 EOF,请使用: ^Z (Ctrl+Z) in Windows ^D (CTRL+D) on Unix-like systems

标签: python python-3.x dictionary maps


【解决方案1】:
N=int(input())
phoneBook={}

for _ in range(N):
    name,contact=input().split()
    phoneBook[name]=contact

try:
    while(True):
        check=str(input())
        if check in phoneBook:
            print(check+"="+phoneBook[check])
        else:
            print('Not found')

except(EOFError):
    pass

【讨论】:

    【解决方案2】:

    试试这个

    N=int(input())
    d={}
    for i in range(N):
        entry=input().split()
        d[entry[0]]=entry[1]
    
    ans=[]
    
    try:
        while(1):
            new=str(input())
            if(new in d.keys()):
                ans.append(new+"="+str(d[new]))
            else:
                ans.append('Not found')
    except(EOFError):
        pass
    
    for a in ans:
        print(a)
    

    while(1) 循环解决了连续运行的问题,try except 块将有助于终止流程。

    【讨论】:

      【解决方案3】:

      您似乎正在使用input() 作为获取用户输入的方式。 输入的问题是,当没有更多输入要读取时,它会引发 EOFError。

      考虑使用sys.stdin.readline().strip(),而不是使用输入,它会在EOF 情况下返回一个空字符串''。然后您可以使用它来评估您的 while 循环。

      sys.stdin.readline() and input(): which one is faster when reading lines of input, and why?

      或者捕获@Siddhant 回答的 EOFError

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2022-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多