Читать оригинал на dev.to
Я практикую свои структуры данных и алгоритмы на LeetCode уже несколько месяцев, и это потрясающая платформа. Качество вопросов, как правило, отличное, есть очень хорошие объяснения для большинства решений, и вокруг всего этого есть очень мотивированное и активное сообщество. В целом, LeetCode — отличная платформа.
НО, у меня было две небольшие проблемы с ним:
- Лично я никогда не понимал идею написания кода и его тестирования в веб-редакторе. Я имею в виду, что у меня есть собственная среда программирования, приспособленная именно к тому, как мне нравится писать и тестировать свой код. И да, учитывая, что мне придется использовать документ Google или что-то в этом роде для своих интервью, но я все же предпочитаю контролировать то, как я тренируюсь.
- Я хотел бы хранить и тестировать свои решения локально, с контролем версий, чтобы я мог вернуться к ним позже, легко искать их, вносить изменения с течением времени и просто убедиться, что я никогда не потеряю свой код.
Поэтому для этого я создал свой собственный рабочий процесс LeetCode и локальную библиотеку тестирования:
python-leetcode-бегун
И это сделало меня во много раз более продуктивным в решении проблем с литкодом.
Пример рабочего процесса
- Я начинаю с того, что открываю репозиторий на github, где храню все свои проблемы с leetcode:
- Затем я перехожу на любую проблемную страницу leetcode (пример: Plus One). Я копирую название проблемы и форматирую его для использования в качестве имени моего файла (я специально создал инструмент командной строки snekify для этого), а затем копирую фрагмент кода решения.
- Затем я копирую данные примеры тестовых случаев в переменную с именем
tests
:
- Затем пришло время написать решение и протестировать его с помощью команды
pyleet
из моей библиотеки тестирования:
- О, о. Похоже, я пропустил крайний случай. Исправим код:
И вот все тесты проходят. Теперь вы можете скопировать файл кода (да, с tests
и всем остальным) прямо в редактор leetcode и отправить его. Больше никаких глупых «неправильных ответов».
Расширенные варианты использования
Другой пример: Цикл связанного списка
Теперь у этого есть проблема: нам нужно преобразовать данный вход в структуру данных связанного списка, прежде чем запускать наше решение.
Например, в других вопросах вам не нужно просто сопоставлять ожидаемый результат с выходом функции. Например, иногда он может попросить вас изменить список на месте, или у некоторых могут быть ответы, где порядок вывода не имеет значения, и т. д.
В этом случае вы можете предоставить собственную настраиваемую функцию проверки подлинности.
validator
— это функция, которая получает 3 аргумента:
method
: ваша функция решения leetcodeinputs
: ваш тестовый входной кортежexpected
: ожидаемое выходное значение теста
Пример решения валидатора
- Перейдите к вопросу.
- Скопируйте название проблемы, отформатируйте его и вставьте образец кода и примеры.
- Теперь, чтобы иметь возможность запускать тесты локально, нам нужно написать собственный код для преобразования массива в связанный список:
- Теперь мы можем решить вопрос:
- Запуск тестов:
И, конечно же, мы прошли все тестовые случаи. Теперь просто скопируйте весь код в leetcode и:
Полное решение вы можете найти здесь.
Дополнительные советы
- Я использую mypy для запуска статической проверки типов в моем коде, что гарантирует такие вещи, как отсутствие исключений нулевого указателя во время выполнения.
- Я создал набор фрагментов кода, которые автоматически заполняют тестовые примеры, функцию проверки и утверждения утверждений. Эти фрагменты можно использовать в VSCode на данный момент. Больше информации на github page.
- Мои решения всех задач хранятся в этом github-репозитории.
Сноски
В настоящее время этот пакет работает только с решениями Python. Но при необходимости его можно расширить для использования вообще любого языка. Если вы заинтересованы в работе над поддержкой других языков, дайте мне знать.
Спасибо за чтение, я надеюсь, что это поможет вам быть более продуктивным. ✨