web-dev-qa-db-ja.com

hackerrankのコードで「タイムアウトにより終了しました」エラーが表示されるのはなぜですか?

特定のテストケースのみでコードを実行すると、「タイムアウトエラーにより終了しました」というメッセージが表示されました。私のコードは他のテストケース用に正常にコンパイルされましたが。誰かがこれを手伝ってくれますか?

リンク-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を学ぶアマチュアです。質問するための多くのルールのいずれかに違反した場合は申し訳ありません:(。私を修正し、ここで良い方法でコミュニティに貢献するのを手伝ってください:)

13
Swaggerboy

ロジックの問題は、シーケンシャル構造である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);
     }
  }

これが説明することを願っています。

11
Sanjeev

通常、Problem Setters(Hackerrank)で設定された最大時間よりもコードの実行時間が長くなると、「タイムアウトエラーにより終了しました」が発生します。

試した問題は、HashMapの使用方法を教えることを目的としていますが、配列を使用して問題を解決しました。配列での検索は、O(1)時間で検索するために通常ハッシュされるMapsのそれよりもO(n)長い時間がかかります。入力が小さい場合、プログラムは正常に動作しますが、100000エントリ、それはより長い時間がかかり、タイムアウトになりますので、配列とArrayListsの代わりにマップを使用してください

6
Chirram Kumar

私はあなたのようなエラーを受け取っていません。また、コードがテストに合格しない唯一の理由は、期待どおりに小文字のFoundではなく、大文字のfoundをスペルしたためです。

楽しんで。

0
UDKOX