Читать оригинал на dev.to

Я практикую свои структуры данных и алгоритмы на LeetCode уже несколько месяцев, и это потрясающая платформа. Качество вопросов, как правило, отличное, есть очень хорошие объяснения для большинства решений, и вокруг всего этого есть очень мотивированное и активное сообщество. В целом, LeetCode — отличная платформа.

НО, у меня было две небольшие проблемы с ним:

  1. Лично я никогда не понимал идею написания кода и его тестирования в веб-редакторе. Я имею в виду, что у меня есть собственная среда программирования, приспособленная именно к тому, как мне нравится писать и тестировать свой код. И да, учитывая, что мне придется использовать документ Google или что-то в этом роде для своих интервью, но я все же предпочитаю контролировать то, как я тренируюсь.
  2. Я хотел бы хранить и тестировать свои решения локально, с контролем версий, чтобы я мог вернуться к ним позже, легко искать их, вносить изменения с течением времени и просто убедиться, что я никогда не потеряю свой код.

Поэтому для этого я создал свой собственный рабочий процесс LeetCode и локальную библиотеку тестирования:

python-leetcode-бегун

И это сделало меня во много раз более продуктивным в решении проблем с литкодом.

Пример рабочего процесса

  • Я начинаю с того, что открываю репозиторий на github, где храню все свои проблемы с leetcode:

  • Затем я перехожу на любую проблемную страницу leetcode (пример: Plus One). Я копирую название проблемы и форматирую его для использования в качестве имени моего файла (я специально создал инструмент командной строки snekify для этого), а затем копирую фрагмент кода решения.

  • Затем я копирую данные примеры тестовых случаев в переменную с именем tests:

  • Затем пришло время написать решение и протестировать его с помощью команды pyleet из моей библиотеки тестирования:

  • О, о. Похоже, я пропустил крайний случай. Исправим код:

И вот все тесты проходят. Теперь вы можете скопировать файл кода (да, с tests и всем остальным) прямо в редактор leetcode и отправить его. Больше никаких глупых «неправильных ответов».

Расширенные варианты использования

Другой пример: Цикл связанного списка

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

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

В этом случае вы можете предоставить собственную настраиваемую функцию проверки подлинности.

validator — это функция, которая получает 3 аргумента:

  • method: ваша функция решения leetcode
  • inputs: ваш тестовый входной кортеж
  • expected: ожидаемое выходное значение теста

Пример решения валидатора

  • Перейдите к вопросу.
  • Скопируйте название проблемы, отформатируйте его и вставьте образец кода и примеры.

  • Теперь, чтобы иметь возможность запускать тесты локально, нам нужно написать собственный код для преобразования массива в связанный список:

  • Теперь мы можем решить вопрос:

  • Запуск тестов:

И, конечно же, мы прошли все тестовые случаи. Теперь просто скопируйте весь код в leetcode и:

Полное решение вы можете найти здесь.

Дополнительные советы

  • Я использую mypy для запуска статической проверки типов в моем коде, что гарантирует такие вещи, как отсутствие исключений нулевого указателя во время выполнения.
  • Я создал набор фрагментов кода, которые автоматически заполняют тестовые примеры, функцию проверки и утверждения утверждений. Эти фрагменты можно использовать в VSCode на данный момент. Больше информации на github page.
  • Мои решения всех задач хранятся в этом github-репозитории.

Сноски

В настоящее время этот пакет работает только с решениями Python. Но при необходимости его можно расширить для использования вообще любого языка. Если вы заинтересованы в работе над поддержкой других языков, дайте мне знать.

Спасибо за чтение, я надеюсь, что это поможет вам быть более продуктивным. ✨