哈希表:勒索笔记-Swift中的黑客排名超时

时间:2018-09-17 15:41:20

标签: arrays swift dictionary swift3 hashmap

我的代码还不错,但是在一些测试案例上还是花了点时间,有什么技巧可以改善这个问题?我的猜测是indexOf函数花费的时间太长。

func checkMagazine(magazine: [String], note: [String]) -> Void {
var mutableMag = magazine
if note.count > mutableMag.count {
    print("No")
    return
}
for word in note {
    if let index = mutableMag.index(of: word) {
        mutableMag.remove(at: index)
    } else {
        print("No")
        return
    }
}
print("Yes") }

请在以下链接中找到挑战:https://www.hackerrank.com/challenges/ctci-ransom-note/problem

2 个答案:

答案 0 :(得分:2)

一种通过所有测试的可能解决方案是使用NSCountedSet将单词存储在笔记和杂志中,并将note中每个单词的数量与{{1}中该单词的数量进行比较},如果其中任何一个在magazine中较低,请尽早返回并打印magazine

我还建议即使黑客等级生成的函数原型返回No,也要更改函数签名以返回Bool值。最好使Void为纯函数,而不在其中执行任何I / O操作。

checkMagazine

然后,您只需要将生成的代码的结尾更改为以下内容:

func checkMagazine(magazine: [String], note: [String]) -> Bool {
    let magazineWords = NSCountedSet(array: magazine)
    let noteWords = NSCountedSet(array: note)
    for noteWord in noteWords {
        if magazineWords.count(for: noteWord) < noteWords.count(for: noteWord) {
            return false
        }
    }
    return true
}

答案 1 :(得分:0)

func checkMagazine(magazine: [String], note: [String]) -> Void {
    var notesDictionary : [String : Int] = [:]
    var magazineDictionary : [String : Int] = [:]

    var canMakeRansom = true

    for n in note {
        var count = notesDictionary[n] ?? 0
        count += 1
        notesDictionary[n] = count
    }

    for n in magazine {
        var count = magazineDictionary[n] ?? 0
        count += 1
        magazineDictionary[n] = count
    }

    for note in notesDictionary {
        if note.value > magazineDictionary[note.key] ?? 0 {
            canMakeRansom = false
        }
    }
    print(canMakeRansom ? "Yes" : "No")
}

这是解决此问题的另一种方法。 我认为这可以完成NSCountedSet本身的工作。