Рубрики
Без рубрики

Ransom Note HackeRrank Challenge в Python

Решить вызов Ransom Note Hackerrank в Python с использованием хэш-таблиц.

Автор оригинала: Robin Andrews.

Этот вызов программирования Python адаптирован из вызова на HackeRrank под названием Ransom Примечание, который является частью коллекции с участием хэш таблицы. Если вы не знакомы с HackeRrank, вы можете прочитать об этом здесь: Введение в HackeRrank для программистов Python Отказ

Описания проблемы на HackeRrank иногда имеют немного неясную, и один из навыков, необходимых для решения проблем, – это способность работать именно то, что просят. Иногда легче идти прямо на вход/вывод, необходимый для того, чтобы почувствовать, что требуется, а затем прочитать описание, чтобы увидеть, как это приводит к спецификации проблемы.

Основная идея с Выкуп примечание Вызов заключается в том, что у вас есть два списка значений, и вам нужно определить, можно ли формироваться один список из элементов в другом списке.

Например, мышление о приговорах в виде списков слов,

Дай мне одну великую сегодня ночь Содержит Дайте один гранд сегодня Так что ответ – да

тогда как для два раза три не четыре содержащий два раза два - четыре ответ – это Нет , как, хотя все слова присутствуют во втором списке, не хватает никаких случаев слова Два Отказ

Иметь смысл?

Пойти на себя сейчас. На этом этапе не беспокойтесь о повышении эффективности вашего решения – вместо этого просто пойти на подход грубой сил, чтобы почувствовать проблему.

Вот заглушка и некоторые тесты, чтобы вы начали. Цель состоит в том, чтобы завершить CheckMagazine () функция, чтобы получить тесты, чтобы пройти. С Assert Тесты, вы будете знать, что они прошли, если вы запустите свой код и не получаете AssertionError – то есть ничего не происходит. Это хорошо.

Обратите внимание, что в проблеме на HackeRrank ответ печатается как Да или Нет а не вернулся как логический.

def checkMagazine(magazine, note):
    pass


magazine = "give me one grand today night".split()
note = "give one grand today".split()
assert checkMagazine(magazine, note) is True

magazine = "two times three is not four".split()
note = "two times two is four".split()
assert checkMagazine(magazine, note) is False

Решение грубой силы для выпускного вызова Python

Вот моя оригинальная попытка. Можете ли вы увидеть, что было мое мышление? Я пытался удалить каждый предмет в Примечание от сообщение , но если это подняло исключение, я установил возвращаемое значение в false.

def checkMagazine(magazine, note):
    for word in note:
        try:
            del magazine[magazine.index(word)]
        except Exception as e:
            return False
    return True


magazine = "give me one grand today night".split()
note = "give one grand today".split()
assert checkMagazine(magazine, note) is True

magazine = "two times three is not four".split()
note = "two times two is four".split()
assert checkMagazine(magazine, note) is False

Счетчики Python

Раствор выше, и, вероятно, много других решений грубой силы, проходит большинство испытаний на HackeRrank, но есть несколько, где он раз разумеется. Нам нужно сделать лучше.

В том факте есть большая подсказка, что эта проблема возникает в коллекции Abut Hash Tables. В Python это означает, что мы, вероятно, собираемся использовать словарь. Однако, поскольку этот словарь будет содержать количество различных слов в наших списках, имеет смысл использовать специальный тип словаря, доступный в Python, называемый Счетчик Отказ

Вы можете увидеть Python Счетчик В действии в следующем примере:

from collections import Counter

note = "give one grand today".split()
note_counter = Counter(note)
print(note_counter)

Если по какой-либо причине с использованием специализированного инструмента, такого как коллекции. Counter Если запрещено (например, вы изучаете учебную программу, который не поощряет «такого рода вещей»), вы можете создать встречный словарь вручную, делая что-то подобное:

magazine = "give me one grand today night".split()

freq = {}
for word in magazine:
    if word in freq:
        freq[word] += 1
    else:
        freq[word] = 1


print(freq)

Решение для выставления вызова заметок в Python

Один конечный кусок, который вы можете найти полезным в письменном виде эффективное решение для вызова выступления Ransom Note – это оператор пересечения, как в Счетчик (а) & счетчик (б) Отказ Это возвращает минимум соответствующих счет.

Со всеми, что в вашем распоряжении, хорошая попытка проблемы для себя нет, либо используя заглушку и тесты сверху, либо На участке HackeRrank Отказ Удачи.

Мое решение ниже для справки, когда вы будете готовы.

from collections import Counter


def checkMagazine(magazine, note):
    mag_counter = Counter(magazine)
    note_counter = Counter(note)
    return mag_counter & note_counter == note_counter


magazine = "give me one grand today night".split()
note = "give one grand today".split()
assert checkMagazine(magazine, note) is True

magazine = "two times three is not four".split()
note = "two times two is four".split()
assert checkMagazine(magazine, note) is False

В этом посте мы посмотрели на вызов вызове выступления от HackeRrank, а как решить его с Python. Я надеюсь, что вы нашли это интересно и полезно.

Счастливые вычисления!