web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois une erreur "terminé en raison d'un délai d'attente" pour mon code chez hackerrank?

J'ai reçu un message d'erreur "Terminé en raison d'une erreur de temporisation" lorsque j'ai exécuté mon code uniquement pour certains cas de test spécifiques. Même si mon code a été compilé avec succès pour d’autres cas de test. Quelqu'un pourrait m'aider avec ça? 

Link -https://www.hackerrank.com/challenges/phone-book

Déclaration du problème: 

Vous recevez un répertoire composé du nom des personnes et de leur numéro de téléphone. Après cela, vous recevrez le nom de quelqu'un comme requête. Pour chaque requête, imprimez le numéro de téléphone de cette personne.

Format d'entrée:

La première ligne aura un entier indiquant le nombre d'entrées dans le répertoire. Chaque entrée est composée de deux lignes: un nom et le numéro de téléphone correspondant.

Après cela, il y aura quelques requêtes. Chaque requête contiendra le nom d'une personne. Lire les requêtes jusqu'à la fin du fichier.

Contraintes:

1 <= n <= 100000

1 <= Requête <= 100000

Le nom d'une personne est composé uniquement de lettres anglaises minuscules et peut être sous le format 'prénom nom' ou au format 'prénom'. Chaque numéro de téléphone a exactement 8 chiffres sans zéros au début.

Format de sortie :

Pour chaque cas, indiquez "Non trouvé" si la personne n'a aucune entrée dans le répertoire. Sinon, écrivez le nom et le numéro de téléphone de la personne. Voir exemple de sortie pour le format exact.

Pour faciliter le problème, nous avons fourni une partie du code dans l'éditeur. Vous pouvez soit compléter ce code, soit écrire complètement vous-même.

Mon code est le suivant:

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: Ceci est ma première question sur le forum. Je suis un amateur apprenant Java. Désolé si j'ai enfreint l'une des nombreuses règles pour poser une question :(. S'il vous plaît, corrigez-moi et aidez-moi à contribuer à la communauté ici dans le bon sens :)

11
Swaggerboy

Le problème de votre logique est qu’elle est implémentée en utilisant ArrayList qui est une structure séquentielle. Toute recherche dans la liste sera séquentielle et, dans le cas de tests volumineux, sa recherche dans votre liste de noms prend trop de temps.

La carte de hachage est plus appropriée pour un exemple d'annuaire téléphonique, car elle conserve les données dans la clé, la paire de valeurs et les recherches sont rapides en raison du hachage.

Voici une version implémentée avec 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);
     }
  }

J'espère que cela explique.

10
Sanjeev

Habituellement, "Terminé en raison d'une erreur de délai d'attente" survient lorsque l'exécution de votre code prend plus de temps que la durée maximale définie par le dépanneur de problèmes (Hackerrank). 

Le problème que vous avez essayé est destiné à vous apprendre comment utiliser HashMaps, mais vous avez résolu le problème en utilisant des tableaux. La recherche dans des tableaux prend O (n) plus longtemps que celle de Maps, qui sont généralement hachées pour rechercher dans le temps O(1). Pour une entrée plus petite, votre programme fonctionne bien, mais pour des entrées plus grandes, comme 100 000 entrées, cela prendra plus de temps et entraînera un dépassement de temps. Donc, utilisez des cartes plutôt que des tableaux et des listes de tableaux

5
Chirram Kumar

Je ne reçois aucune erreur comme la tienne. En outre, la seule raison pour laquelle votre code ne réussit pas le test est que vous avez orthographié Found en majuscule au lieu de found en lowecase comme prévu.

S'amuser.

0
UDKOX