Pull to refresh

Сказ о том, как я за год решил более 600 leetcode задач

Level of difficultyEasy
Reading time7 min
Views109K

Всем салют!

Хочу рассказать вам историю о том, как я начинал с уровня — «не могу решить даже 1 easy задачу из 10» до уровня — «могу решить каждую вторую medium задачу» и прошел несколько coding сессий в таких компаниях как Meta, Booking, Careem, Avito...

Статистика с leetcode на дату 13.01.2024
Статистика с leetcode на дату 13.01.2024

Началось все с того, что в конце 2022 года я твердо решил, что хочу устроиться в FAANG компанию, но для этого, как вы наверно все знаете, нужны знания алгоритмов и структур данных, коих у меня не было, потому что в обычной работе тебе не нужны heap, tree, disjoint set и другие структуры данных, поэтому начать пришлось практически с нуля.

Было очень тяжело, т.к. не знал с чего начинать, по какому принципу решать задачи, что важно, а что не очень, сколько нужно решить задач, чтоб чувствовать уверенность, получится ли вообще перейти на medium задачи, т.к. решение даже easy задач заводило в тупик, ниже постараюсь ответить на все эти вопросы.

Самое первое, что приходит в голову, когда хочешь начать решать задачи на литкоде — это открыть страницу с задачами https://leetcode.com/problemset/all/ и начать решать их подряд, но это не очень хорошая идея, даже если вы применили фильтр easy, потому что очень много задач с пометкой easy очень сложно решить и это может сильно демотивировать, а то и понизить самооценку.

Советы:

  1. Первый совет - обращайте внимание на процент Acceptance, чем этот процент больше, тем лучше, потому что это означает, что у многих людей получается решить эту задачу и есть вероятность, что и у вас получится.
    Также можете открыть study plan и попробовать решать задачи оттуда:
    https://leetcode.com/studyplan/top-100-liked/ - Топ 100 залайканных задач, если много лайков, значит есть вероятность, что это не какая-то хитросплетеная задача, которая может понизить вашу оценку(есть много задач для которых нужны специфичные знания и это может быть неочевидно с первого взгляда)
    https://leetcode.com/studyplan/top-interview-150/ - Топ 150 задач для подготовки к интервью, вероятность встретить эти задачи на интервью высока, но тут могут быть сложные задачи, которые трудно будет решить в начале пути
    https://leetcode.com/studyplan/leetcode-75/ - Как пишет leetcode, это "Must-do problem list for interview prep"
    Задачи в этих списках распределены на разные темы, решать нужно их следуя следующему совету.

  2. Второй совет - начинайте с самых фундаментальных структур данных, таких как array(одномерный/двумерный), set, hashmap, они будут встречаться вам постоянно, к примеру, во многих задачах время выполнение можно улучшить добавив set или hashmap(но нужно учесть, что увеличится потребление памяти) и только после того как освоите их, можно начинать углубляться в другие структуры как stack, queue, linked list, tree, graphs.
    На самом leetcode есть карточки, в которых дается объяснение структурам данных и алгоритмам + задачи для закрепления этих тем - https://leetcode.com/explore/learn/ , как и написано выше, начинайте с простых карточек - array, string и постепенно повышайте уровень, я несколько раз возвращался к карточкам, т.к. некоторые моменты порой были непонятны с первого раза, поэтому не думайте, что с вами что-то не так, если что-то непонятно, вернетесь потом и обнаружите, что уже понимаете это.
    https://neetcode.io/roadmap - тут есть roadmap с темами и задачами, очень советую
    https://www.techinterviewhandbook.org/grind75 - можно создать понедельный план с применением различных фильтров
    https://seanprashad.com/leetcode-patterns/ - список из 150 популярных задач, разделенные на темы, сложность и компании

  3. Третий совет - если не можете придумать оптимальное решение, начинайте с решения "в лоб", как только получится, подумайте над тем, как это решение можно улучшить, может можно использовать какую-то структуру? может массив можно отсортировать? а что если использовать set или hashmap? можно ли использовать какой-то шаблон? Если ничего не помогает и вы уже потратили 20-40 минут, то смело открывайте решение задачи и изучайте это решение, как только вы это сделали, закройте решение и попробуйте заново решить(таких итераций может быть несколько, это нормально!), если после нескольких итераций не получилось, просто перепечатайте решение(я неоднократно так делал), НО не забудьте через время вернуться к этой задаче и попробовать решить заново(вполне вероятно, что не получится и это тоже нормально, просто повторяете все шаги заново, у меня бывали случаи, когда я одну и ту же задачу решал и по 10 раз, пока точно не буду уверен, что точно понял)

  4. Четвертый совет - пройдитесь по этим 14 шаблонам https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed , особенно уделите внимание two pointers, sliding window и fast & slow pointers, т.к. они чаще всего встречаются. Берете шаблон, находите задачи под этот шаблон(на странице с leetcode проблемами есть фильтр по тегам, нужно выбрать нужный тег, к примеру "Two pointers" или "Sliding window" и т.д.) и решаете столько задача, сколько нужно, чтоб закрепить эту тему.

  5. Пятый и самый важный совет - практика, практика и еще раз практика, в начале мне хотелось каждый раз плакать от своей тупости, потому что не мог решать даже простые задачи и это не преувеличение, фраза - "какой же я тупой" не уходила из головы первые несколько месяцев и даже после решения 700 задач все еще бывают моменты, когда самооценка падает, если не получилось решить какую-то задачу, особенно если оказалось, что решается очень легко, но что важно - с каждой решенной задачей вы будете становиться лучше относительно себя.

Минус литкода решили на этой платформе https://firecode.io/ , где задачи даются один за другим, начиная с легких и повторяя уже решенные задачи, чтоб закрепить. Есть объяснение разных тем, после решения задачи можно посмотреть как другие решили, что очень полезно, т.к. ты видишь разные подходы решения одной и той же задачи.

FAQ:

  1. Что делать, если не получается решить задачу?

    Если после 30-40 минут у вас не получилось решить задачу, то посмотрите решение, попробуйте найти видео решение этой задачи, как только посмотрели и разобрали, попробуйте решить заново, если не получилось, еще раз посмотрите и так по кругу. Время от времени возвращайтесь к старым задачам и решайте их заново, особенно если решение какой-то задачи далось вам с трудом.
    Я порой одну и ту же задачу решал по 10-15 раз, а то и больше

  2. Сколько задач нужно решить, чтобы начать откликаться на вакансии?

    Тут все индивидуально, я полгода каждый день решал(сам или с помощью видео) несколько задач, решил где-то 300 задач и только в этот момент почувствовал почву под ногами, а уверенность почувствовал только после решение где-то 400-500 задач. Некоторым достаточно и 100-200 задач, к сожалению я не из их числа.

  3. Какой язык программирования выбрать для решения задач?
    Если коротко - Python.
    Я начинал решать на php, потом перешел на go, после начал решать на java и наконец после просмотра видео https://www.youtube.com/watch?v=0K_eZGS5NsU решил попробовать python и с тех пор решаю на этом ЯП.
    Java - тратишь время на большие конструкции, к примеру - List<Integer> items = new ArrayList<>();
    PHP - путался в аргументах функций, неудобно было в целом писать, хотя практически все время пишу на этом языке
    Go - мало встроенных функций, даже min/max, теперь уже есть, но тогда не было, также нужно конвертировать int в float и обратно, тратишь лишнее время, хотя код и предсказуемый
    Python - лаконичный код, много встроенных функций, которые помогают решать задачи(Counter, defaultdict, divmod, lambda и т.д.), время тратишь именно на решение задачи, а не на печатания и прочее, скорость на собеседовании очень важна.

  4. Как найти время на задачи?
    В моем случае я старался решать по 2 задачи в день, одну задачу до начала работы и вторую задачу после работы. На выходных уделял больше времени, смотрел видео, читал статьи, старался решать больше задач, также старался повторно решать старые задачи, чтобы закрепить тему и задачу.

  5. Нужно ли покупать leetcode premium?

    Самое полезное у premium - вы можете посмотреть в каких компаниях давали ту или иную задачу, если вы готовитесь к конкретной компании, то рекомендую, иначе достаточно бесплатной версии, т.к. видео объяснение задачи можно найти на канале Neetcode(ссылка ниже) и т.д.

  6. Стоит ли покупать доступ к educative.io?

    Очень много видел рекомендаций курса Grokking Coding Interview Patterns от educative, но не нашел этот курс очень полезным, единственное понравилось визуальное объяснение, но на мой взгляд лучше посмотреть видео на ютуб

  7. Стоит ли покупать доступ к algoexpert.io?

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

leetcode rewind за 2023 год
leetcode rewind за 2023 год

Результат:

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

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

  3. В процессе работы начал чуть иначе смотреть на код, где-то видишь, что можешь использовать больше памяти и сократить time complexity, а где-то наоборот.

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

Полезные ссылки:

https://www.youtube.com/@NeetCode - пожалуй самый полезный канал, где человек в доступной форме объясняет задачу и решение
https://www.youtube.com/@WilliamFiset-videos - тоже очень много полезных видео с объяснениями разных структур данных
https://www.youtube.com/c/BackToBackSWE - объясняет на доске структуры данных, задачи
https://www.youtube.com/@insidecode
https://www.youtube.com/@geekific
https://www.youtube.com/@MichaelMuinos
https://www.youtube.com/c/NickWhite
https://www.youtube.com/channel/UCMrgnopgrjjIJn-xyYhZ7nA
https://www.coursera.org/learn/algorithms-part1-ru - много рекомендаций, сам не проходил
https://www.youtube.com/@idsulik - мой канал, первое видео было добавлено 3 дня назад, начинаю с нуля(съемка видео, делать видеоуроки), поэтому просьба строго не судить, но буду рад любой конструктивной критике

В закрепленных комментариях можете найти рекомендации от читателей

Tags:
Hubs:
Total votes 121: ↑112 and ↓9+129
Comments407
1

Articles