特定のテストケースのみでコードを実行すると、「タイムアウトエラーにより終了しました」というメッセージが表示されました。私のコードは他のテストケース用に正常にコンパイルされましたが。誰かがこれを手伝ってくれますか?
リンク-https://www.hackerrank.com/challenges/phone-book
問題ステートメント:
ユーザーの名前と電話番号で構成される電話帳が提供されます。その後、クエリとして誰かの名前が与えられます。クエリごとに、その人の電話番号を印刷します。
入力フォーマット:
最初の行には、電話帳のエントリ数を示す整数が含まれます。各エントリは、名前と対応する電話番号の2行で構成されています。
これらの後に、いくつかのクエリがあります。各クエリには人の名前が含まれます。ファイルの終わりまでクエリを読み取ります。
制約:
1 <= n <= 100000
1 <=クエリ<= 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を学ぶアマチュアです。質問するための多くのルールのいずれかに違反した場合は申し訳ありません:(。私を修正し、ここで良い方法でコミュニティに貢献するのを手伝ってください:)
ロジックの問題は、シーケンシャル構造である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);
}
}
これが説明することを願っています。
通常、Problem Setters(Hackerrank)で設定された最大時間よりもコードの実行時間が長くなると、「タイムアウトエラーにより終了しました」が発生します。
試した問題は、HashMapの使用方法を教えることを目的としていますが、配列を使用して問題を解決しました。配列での検索は、O(1)時間で検索するために通常ハッシュされるMapsのそれよりもO(n)長い時間がかかります。入力が小さい場合、プログラムは正常に動作しますが、100000エントリ、それはより長い時間がかかり、タイムアウトになりますので、配列とArrayListsの代わりにマップを使用してください
私はあなたのようなエラーを受け取っていません。また、コードがテストに合格しない唯一の理由は、期待どおりに小文字のFound
ではなく、大文字のfound
をスペルしたためです。
楽しんで。