首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈希表:勒索说明-快速超时中的Hacker等级

哈希表:勒索说明-快速超时中的Hacker等级
EN

Stack Overflow用户
提问于 2018-09-17 15:41:19
回答 2查看 552关注 0票数 0

我的代码很好,但是继续在一些测试用例上花时间,有什么改进这一点的建议吗?我猜indexOf函数花费的时间太长了。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-17 16:43:08

通过所有测试的一个可能的解决方案是使用NSCountedSet存储便笺和杂志中的单词,并将note中的每个单词的计数与magazine中的每个单词的计数进行比较,如果其中任何一个在magazine中较低,则进行早期返回并打印No

我还建议将函数签名更改为返回Bool值,即使由黑客级别生成的函数原型返回Void。最好是使checkMagazine成为一个纯函数,而不是在其中执行任何I/O操作。

代码语言:javascript
复制
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
}

然后,只需将生成的代码的末尾更改为:

代码语言:javascript
复制
let magazineWorks = checkMagazine(magazine: magazine, note: note)
if magazineWorks {
    print("Yes")
} else {
    print("No")
}
票数 6
EN

Stack Overflow用户

发布于 2019-08-14 12:28:21

代码语言:javascript
复制
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自己所做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52371400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档