如何优化Dictionary和while循环

时间:2017-01-05 13:02:24

标签: dictionary optimization while-loop swift3 runtime

我正在hackerrank网站上解决任务,并收到与测试中放置的数据量相关的有趣Runtime Error

任务:

  

根据姓名和电话号码,汇编一张映射的电话簿   朋友'姓名分别为各自的电话号码。那你就是   给出一个未知数量的名称来查询您的电话簿。对于   每个查询,打印电话簿中的相关条目   形式名称= 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。我已经做了一些调整,他们与minimumCapacity的{​​{1}}以及Dictionary而不是while的使用情况相关联。你能告诉我应该修理什么吗?

1 个答案:

答案 0 :(得分:2)

输入数据包含固定部分(编号N条目, 后跟N行名称/数字对)和变量部分 (查询)。

您可以对固定部分使用强制展开readLine()!,因为 你知道它会成功。但是对于你可变的部分 致电readLine()直到它返回nil

代码看起来像这样:

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")
    }
}