Хэш-таблицы: Примечание выкупа - Ранжирование хакера в быстром тайм-ауте - PullRequest
0 голосов
/ 17 сентября 2018

Мой код в порядке, но у вас есть время на некоторые тестовые случаи, какие-нибудь советы, чтобы улучшить это? Я предполагаю, что функция 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 голосов
/ 14 августа 2019
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")
}

Это еще один способ решить эту проблему. Я думаю, что это делает то, что делает NSCountingSet сам по себе.

0 голосов
/ 17 сентября 2018

Одним из возможных решений, которое проходит все тесты, является использование NSCountedSet для хранения слов в заметке и журнале и сравнение количества каждого слова в note со счетом этого слова в magazine и, если они есть, ниже в magazine, делая ранний возврат и печатая No.

Я бы также предложил изменить сигнатуру функции, чтобы она возвращала значение Bool, хотя прототип функции, сгенерированный хакерским рангом, возвращает Void. Лучше сделать 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
}

Тогда вам просто нужно изменить конец сгенерированного кода следующим образом:

let magazineWorks = checkMagazine(magazine: magazine, note: note)
if magazineWorks {
    print("Yes")
} else {
    print("No")
}
...