2017-01-05 9 views
0

私はハッカーランクサイトで課題を解決しており、テストに配置されたデータの量に関連する面白いRuntime Errorを受け取ります。ディクショナリとwhileループの最適化方法

タスク:

名前と電話番号が与えられ、それぞれの電話番号に 友人の名前をマップする電話帳を組み立てます。あなたは あなたの電話帳を照会するための未知数の名前が与えられます。 がそれぞれ照会された場合は、電話帳から関連するエントリを という新しい行のname = phoneNumberという形式で印刷します。のエントリが見つからない場合、代わりに 印刷が見つかりません。

私のソリューション:

let n = Int(readLine()!)! //Amount of tests 
let count = n * 2//Insertion to the dictionary and validation of the data 

var step = 0 
var book = Dictionary<String, String>(minimumCapacity: n) 

while step < count { 
    if (step < n) { 
     let bookData = readLine()!.characters.split{$0 == " "}.map(String.init) 
     book[bookData[0]] = bookData[1] 
    } else { 
     let name = readLine()! 
     if let num = book[name] as String! { 
      print("\(name)=\(num)") 
     } else { 
      print("Not found") 
     } 
    } 
    step += 1 
} 

私はRuntime Errorを避けるために、コードの最適化に興味を持っています。私はすでに、for-loopの代わりにのDictionarywhileの使用法で接続されているいくつかの調整を行います。何を修正すべきかアドバイスしていただけますか?

+0

を「最適化」と「ランタイムエラーを避けるには、」二つの異なるタスクです。あなたのプログラムはHackerrankにとって遅すぎるのですか?それとも*エラー*で終了しますか? –

+0

@MartinRすべてのテストケースは、このテストプロダクションを100000個含む要素を除いて正常に実行されています。ランタイムエラー –

+0

* "**未知数の**名前を照会する" *あなたはエントリに*同じ量*のクエリが続くと仮定しているようです。 –

答えて

2

入力データは、固定部(名前/番号のペアのN線続くエントリの数N、 )と可変部 (クエリ)から成ります。

あなたはそれが成功することをを知っ ので、あなたは、固定部分のためreadLine()!をアンラップ強制的に使用することができます。しかし、可変部分についてはを返すまで を呼び出してreadLine()と呼ぶべきです。

コードは次のようになります。

let n = Int(readLine()!)! // Number of entries 
var book = [String: String](minimumCapacity: n) 

for _ in 1...n { 
    let bookData = readLine()!.characters.split{$0 == " "}.map(String.init) 
    book[bookData[0]] = bookData[1] 
} 

while let name = readLine() { 
    if let num = book[name] { 
     print("\(name)=\(num)") 
    } else { 
     print("Not found") 
    } 
} 
関連する問題