Найти тему
Learning to Python

Решил 200 задач на LeetCode

Оглавление

Моя страничка на LeetCode
Моя страничка на LeetCode

Полгода занятий с LeetCode

Как-то незаметно пролетело полгода, как я решаю задачки на LeetCode. Я стал заниматься в начале мая, а сейчас вторая половина ноября. Двести задач - это по одной задаче в день в среднем. И мне кажется, что для такой длинной дистанции, это неплохой результат. Конечно, можно и больше, помню, что однажды решил десять задач за день. Правда они все были очень легкие, решались одной - двумя строчками. Боюсь, что дальше таких задач будет все меньше.

Но все-таки я не гонюсь за количеством (хотя скажу честно, мне нравится отмечать круглые цифры). Мой основной фокус – постоянство. Десять задач в день решить гораздо проще, чем десять дней подряд решать хотя бы одну задачу. У меня же получались и более длинные безостановочные серии. Честно сказать это мотивирует, каждый новый день добавляется в копилочку и очень не хочется начинать все сначала.

Зеленые квадратики означают, что в этот день я решил хотя бы одну задачу
Зеленые квадратики означают, что в этот день я решил хотя бы одну задачу

Это четко видно на картинке выше. В конце августа я не справился с ежедневными занятиями, счетчик серии остановился на 52 днях. Потом я на целый месяц оставил LeetCode. Было не сложно снова решать задачи, просто всегда находились дела поважнее, или не было сил, или просто "начну с понедельника". Зато, когда я снова приступил к работе на LeetCode, стремление побить свой собственный рекорд сильно мотивировало меня, не давая расслабится и пропускать занятия. Сейчас счетчик серии показывает 56 дней, и я не планирую останавливаться...

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

От ста до двухсот

Если на решение первой сотни задач у меня ушло примерно четыре месяца, то со второй я справился гораздо быстрее, менее чем за два. Помогла дисциплина и новый подход к выбору задач.

Новый подход к выбору задач

В начале выбор задач был хаотичным. Я просто открывал предложенные LeetCode варианты, или выбирал задачи из сборников во вкладках "Explore" или "Study plan", или во вкладке "problems" делал фильтрацию задач по темам. С одной стороны, такой подход не давал какой-то системы, задачи каждый раз были новые, подход к их решению одних не был похож на другие. С другой стороны, даже если задачи были из сборника по одной теме я не успевал перепрыгивать "пропасть" между задачами, концепты, которые там применялись были слишком сложными для тогдашнего меня.

С тех пор я стал выбирать задачи по строгому алгоритму. Во-первых, решаю задачи только по определенным темам (сейчас у меня две темы: простые алгоритмы и обработка данных на Pandas), во-вторых иду по уменьшению значений в колонке "процент принятых решений" (не знаю как правильнее перевести "Acceptance"). Колонка "процент принятых решений" соответствует отношению количества принятых решений, проверенных системой, к общему количеству поданных решений. Чем выше этот процент, тем большее количество решений было принято, то есть задача относительно более легкая или, во всяком случае, более понятная.

Фильтрация по разделу Pandas, сортировка по "Acceptance"
Фильтрация по разделу Pandas, сортировка по "Acceptance"

Собственно Pandas

С библиотекой Pandas я познакомился совсем случайно, на стартовой страничке кликнул по верхней новости, вместо раздела с задачами. Там предлагали поучаствовать в тридцатидневном марафоне по этой библиотеке.

30 дней с Pandas
30 дней с Pandas

Мне показалось это интересным, и я начал решать задачи. Конечно, было очень сложно и абсолютно непонятно, но постепенно, понемногу, с подсказками и подсматриваниями, что-то начало получаться.

Тогда я узнал, что Pandas – это очень популярный, мощный и гибкий инструмент для обработки и анализа данных. Причем это библиотека огромная, если пробовать читать документацию, то моментально теряешься в куче кросс-ссылок, настолько она обширная. Но методичные занятия на LeetCode помогли познакомиться с основными концептами и методами библиотеки. Буквально, некоторые задачи были направлены на знакомство с конкретными методами. Например, задача 2885 "Переименуйте колонку" про метод .rename(), а задача 2890 "Форматирование данных: Плавка" про метод .melt() (англ. – таять, плавить). И так задача за задачей в моем словаре появлялись все новые понятия, слова и выражения. Я начал запоминать похожие элементы и чувствовать разницу между похожими методами. Сейчас я прорешал почти все доступные задачи по Pandas. Из 100 последних задач, ровно 70 из этой библиотеки.

-5

Я даже получил свой первый бейджик, мелочь а приятно...

Бейдж за решение задач из сборика "Введение в Pandas" (15 задач)
Бейдж за решение задач из сборика "Введение в Pandas" (15 задач)

Конечно, я не стал аналитиком данных, но что-то уже умею. И такой подход к изучению новой библиотеки мне понравился. Гораздо интереснее, чем зубрить документацию, и полезнее, чем тысяча обучающих видео или туториалов. Надеюсь на LeetCode появится побольше таких задач, было бы классно поработать с NumPy и другими "научными" библиотеками.

Все остальное

-7

Как видно большинство решенных задач относятся к категории "Easy", примерно 15% – "Medium", остальное не в счет. Честно, я не понимаю принципа этого разделения. Может быть решать задачи "Medium" дольше? Правда однажды, мне попалась задача этого уровня, которая решалась одной строкой: return False. То есть в задаче спрашивали: "такое возможно?", и ответом (без всяких вычислений) было "Нет, не возможно". Хотя в целом, задачи "Medium" требуют несколько большего времени.

Попутно я разобрался с list comprihentions и другими полезными фишечками языка Python. Причем некоторые из них вошли в мой постоянный обиход. Например, функцию enumerate() в цикле for стал использовать гораздо чаще, чем стандартное in range().

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

Планы на следующую сотню

1. Буду стараться решать больше задач. Думаю 1.5 в день вполне достижимая цель. А это значит, что следующий такой текст будет не раньше, чем через 2 месяца

2. Закончу с задачами на Pandas, их всего 91 (если не считать платные), так что осталось не много.

3. Буду разбираться с задачами про связанные списки и деревья. Сейчас я их просто пропускаю, но думаю уже пора их освоить.

4. Буду решать больше задач уровня "Medium". Хочу увеличить их долю в два раза, с 15 до 30%.

5. Буду больше писать. Не только разборы задач, а тексты на общие темы, например, "List comprehention на примере задач LeetCode" и т.д.

6. Наконец, хочу попробовать снимать короткие ролики с разбором задач или просто фишечек Python

Спасибо, что дочитали до конца, поставили лайк и подписались

На сегодня все, до скорого

Моя страничка на LeetCode: https://leetcode.com/KapJIcoHH/

Телеграмм: https://t.me/learningtopython