簡體   English   中英

為什么我的代碼在hackerrank上會收到“因超時而終止”錯誤?

[英]Why do i get a "terminated due to timeout" error for my code at hackerrank?

當我僅針對某些特定測試用例運行代碼時,出現“由於超時錯誤而終止”。 即使我的代碼為其他測試用例成功編譯。 有人可以幫我解決這個問題嗎?

鏈接 - https://www.hackerrank.com/challenges/phone-book

問題陳述 :

您將獲得一個電話簿,其中包含人們的姓名和電話號碼。 之后,您將獲得某個人的姓名作為查詢。 對於每個查詢,打印該人的電話號碼。

輸入格式

第一行將有一個整數,表示電話簿中的條目數。 每個條目由兩行組成:姓名和相應的電話號碼。

在這些之后,會有一些查詢。 每個查詢將包含一個人的姓名。 讀取查詢直到文件結束。

約束:

1<=n<=100000

1<=查詢<=100000

一個人的名字僅由小寫英文字母組成,可以采用“first-name last-name”格式或“first-name”格式。 每個電話號碼正好有 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);
     }
  }

希望這能解釋。

通常,當您的代碼執行時間比問題設置者(Hackerrank)設置的最大時間長時,就會發生“由於超時錯誤而終止”。

您嘗試的問題旨在教您如何使用HashMap,但是您使用數組解決了該問題。 在數組中搜索所需的時間比通常經過哈希處理以在O(1)時間中進行搜索的Map所需的時間長O(n)。 對於較小的輸入,您的程序可以正常運行,但對於較大的輸入(如100000條目),則需要更長的時間並導致超時。 因此,請使用Maps而不是Arrays和ArrayLists

我沒有收到像您一樣的任何錯誤。 另外,為什么你的代碼沒有通過測試的唯一原因是因為你拼Found在大寫字母,而不是found在lowecase因為它的預期。

玩得開心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM