当我为某些特定测试用例运行代码时,我收到了“由于超时错误而终止”。即使我的代码成功编译为其他测试用例。有人可以帮我这个吗?
链接 - https://www.hackerrank.com/challenges/phone-book
问题陈述:
您会收到一个电话簿,其中包含人名和电话号码。之后,您将获得一些人的姓名作为查询。对于每个查询,请打印该人的电话号码。
输入格式:
第一行将有一个整数,表示电话簿中的条目数。每个条目由两行组成:名称和相应的电话号码。
在这之后,会有一些疑问。每个查询都包含一个人的姓名。阅读查询直到文件结束。
约束:
1·; = N< = 100000
1·=查询和LT = 100000
一个人的名字只包含小写英文字母,可能采用“名字姓氏”或“名字”格式。每个电话号码都有8位数字,没有任何前导零。
输出格式:
对于每种情况,如果此人没有在电话簿中输入,则打印“未找到”。否则,请打印此人的姓名和电话号码。请参阅样本输出以获取确切的格式。
为了简化问题,我们在编辑器中提供了部分代码。您可以完成该代码,也可以完全自己编写。
我的代码如下:
import java.util.*;
import java.io.*;
class Solution
{
public static void main(String []args)
{
Scanner in = new Scanner(System.in);
int n=in.nextInt();
in.nextLine();
ArrayList<String> name = new ArrayList<String>();
int[] phone = new int[100000];
for(int i=0;i<n;i++)
{
name.add(in.nextLine());
phone[i]=in.nextInt();
in.nextLine();
}
while(in.hasNext())
{
String s=in.nextLine();
int a=name.indexOf(s);
if(a>=0)
{
System.out.println(s + "=" + phone[a] );
}
else
{
System.out.println("Not found");
}
}
}
}
PS:这是我在论坛上的第一个问题。我是业余学习java。对不起,如果我违反了提出问题的许多规则中的任何一条:(。请纠正我并帮助我以良好的方式为社区做出贡献:)
答案 0 :(得分:11)
您的逻辑问题在于它是使用ArrayList
实现的,这是一个顺序结构。列表中的任何搜索都是顺序的,对于大型测试用例,在名称列表中查找时间过长。
哈希映射更适合电话簿示例,因为它将数据保存在键,值对中,并且由于散列而快速查找
这是使用HashMap
实现的版本 Map<String,Integer> phonebook = new HashMap<>();
Scanner in = new Scanner(System.in);
int n=in.nextInt();
in.nextLine();
for(int i=0;i<n;i++)
{
String name=in.nextLine();
int phone=in.nextInt();
in.nextLine();
phonebook.put(name,phone);
}
while(in.hasNext())
{
String s=in.nextLine();
Integer phone = phonebook.get(s);
if(phone==null){
System.out.println("Not found");
} else {
System.out.println(s+"="+phone);
}
}
希望这能解释。
答案 1 :(得分:6)
当您的代码执行时间超过问题设置者(Hackerrank)设置的最长时间时,通常会出现“由于超时错误而终止”。
您尝试的问题旨在教您如何使用HashMaps,但您使用数组解决了问题。在数组中搜索所花费的时间比通常在O(1)时间内搜索的地图的时间长O(n)。对于较小的输入,您的程序工作正常,但对于较大的输入,如100000个条目,它将花费更长的时间并导致超时。因此,使用Maps而不是Arrays和ArrayLists
答案 2 :(得分:0)
我没有像你这样的错误。此外,您的代码未通过测试的唯一原因是因为您在lowecase上拼写Found
大写而不是found
,因为它是预期的。
玩得开心。