Полгода занятий с LeetCode
Как-то незаметно пролетело полгода, как я решаю задачки на LeetCode. Я стал заниматься в начале мая, а сейчас вторая половина ноября. Двести задач - это по одной задаче в день в среднем. И мне кажется, что для такой длинной дистанции, это неплохой результат. Конечно, можно и больше, помню, что однажды решил десять задач за день. Правда они все были очень легкие, решались одной - двумя строчками. Боюсь, что дальше таких задач будет все меньше.
Но все-таки я не гонюсь за количеством (хотя скажу честно, мне нравится отмечать круглые цифры). Мой основной фокус – постоянство. Десять задач в день решить гораздо проще, чем десять дней подряд решать хотя бы одну задачу. У меня же получались и более длинные безостановочные серии. Честно сказать это мотивирует, каждый новый день добавляется в копилочку и очень не хочется начинать все сначала.
Это четко видно на картинке выше. В конце августа я не справился с ежедневными занятиями, счетчик серии остановился на 52 днях. Потом я на целый месяц оставил LeetCode. Было не сложно снова решать задачи, просто всегда находились дела поважнее, или не было сил, или просто "начну с понедельника". Зато, когда я снова приступил к работе на LeetCode, стремление побить свой собственный рекорд сильно мотивировало меня, не давая расслабится и пропускать занятия. Сейчас счетчик серии показывает 56 дней, и я не планирую останавливаться...
Как все начиналось можно почитать тут. А сейчас о пути от сто первой до двухсотой задачи, который был не менее интересным, чем от нуля до ста.
От ста до двухсот
Если на решение первой сотни задач у меня ушло примерно четыре месяца, то со второй я справился гораздо быстрее, менее чем за два. Помогла дисциплина и новый подход к выбору задач.
Новый подход к выбору задач
В начале выбор задач был хаотичным. Я просто открывал предложенные LeetCode варианты, или выбирал задачи из сборников во вкладках "Explore" или "Study plan", или во вкладке "problems" делал фильтрацию задач по темам. С одной стороны, такой подход не давал какой-то системы, задачи каждый раз были новые, подход к их решению одних не был похож на другие. С другой стороны, даже если задачи были из сборника по одной теме я не успевал перепрыгивать "пропасть" между задачами, концепты, которые там применялись были слишком сложными для тогдашнего меня.
С тех пор я стал выбирать задачи по строгому алгоритму. Во-первых, решаю задачи только по определенным темам (сейчас у меня две темы: простые алгоритмы и обработка данных на Pandas), во-вторых иду по уменьшению значений в колонке "процент принятых решений" (не знаю как правильнее перевести "Acceptance"). Колонка "процент принятых решений" соответствует отношению количества принятых решений, проверенных системой, к общему количеству поданных решений. Чем выше этот процент, тем большее количество решений было принято, то есть задача относительно более легкая или, во всяком случае, более понятная.
Собственно Pandas
С библиотекой Pandas я познакомился совсем случайно, на стартовой страничке кликнул по верхней новости, вместо раздела с задачами. Там предлагали поучаствовать в тридцатидневном марафоне по этой библиотеке.
Мне показалось это интересным, и я начал решать задачи. Конечно, было очень сложно и абсолютно непонятно, но постепенно, понемногу, с подсказками и подсматриваниями, что-то начало получаться.
Тогда я узнал, что Pandas – это очень популярный, мощный и гибкий инструмент для обработки и анализа данных. Причем это библиотека огромная, если пробовать читать документацию, то моментально теряешься в куче кросс-ссылок, настолько она обширная. Но методичные занятия на LeetCode помогли познакомиться с основными концептами и методами библиотеки. Буквально, некоторые задачи были направлены на знакомство с конкретными методами. Например, задача 2885 "Переименуйте колонку" про метод .rename(), а задача 2890 "Форматирование данных: Плавка" про метод .melt() (англ. – таять, плавить). И так задача за задачей в моем словаре появлялись все новые понятия, слова и выражения. Я начал запоминать похожие элементы и чувствовать разницу между похожими методами. Сейчас я прорешал почти все доступные задачи по Pandas. Из 100 последних задач, ровно 70 из этой библиотеки.
Я даже получил свой первый бейджик, мелочь а приятно...
Конечно, я не стал аналитиком данных, но что-то уже умею. И такой подход к изучению новой библиотеки мне понравился. Гораздо интереснее, чем зубрить документацию, и полезнее, чем тысяча обучающих видео или туториалов. Надеюсь на LeetCode появится побольше таких задач, было бы классно поработать с NumPy и другими "научными" библиотеками.
Все остальное
Как видно большинство решенных задач относятся к категории "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