В этой статье я хочу написать про мой опыт взаимодействия с платформой LeetCode, и описать свою подготовку к интервью в FAANG подобные компании путём разбиения её на уровни.

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

Уровень -1. Отброс. Решенных задач меньше 10

Как определить

Вы тупой (шутка!). 100% решаемых задач на этом уровне — Easy -. Да, в заголовке написано, что их 5, но я выделил этот уровень, потому что это был мой уровень вначале, и думаю уровень многих, кто в жизни не делал такие задачи.

На этом уровне ты не можешь решить самую первую и популярную задачу на LeetCode - Two Sum любыми способами, брут форс, оптимально, неважно.

Как пройти на следующий уровень

Время, которое понадобится вам, чтобы перейти на следующий уровень около 2-5 часов без перерыва.

Все достаточно просто, на этом уровне не нужно копаться в алгоритмах и структурах данных, надо привыкнуть к самой платформе, понять структуру задач, нужно прочитать внимательно описание задачи, посмотреть на примеры, которые нам дают (input) и что нужно получить (output), засамбитить задачку и понять, что есть такое понятие, как edge cases, когда ваше решение покрывает 3 примера, которые вам дали, но остальные 60 test cases почему-то валятся.

После того как всё-таки покрыли все кейсы, посмотрите решение других ребят в разделе Solutions, которые сделали решение лучше, чем у вас, графики Runtime и Memory. Пока не надо брать в голову, что это за графики, все это изучите на следующем уровне.

Вам нужно решить самые простые задачи на литкоде, они похожи на те, что вы решаете на работе :) Где их найти? Всё очень просто. Идёте в Problems -> Easy -> Сортируете по Acceptance. 

Поиск самых легких задач на LeetCode
Поиск самых легких задач на LeetCode

Смотрите на первые 20 задач и решаете те, которые вам понравились, нужно решить около 10. Решать без разницы как, можно самым глупым брутфорсом, в своей любимой среде со всеми подсказками (но не надо, пожалуйста, использовать ChatGPT:), главное - пройти тесты и почувствовать наконец вкус победы на литкоде. Самый лучший путь к мотивации это маленькие победы, не забывайте об этом, поехали дальше!

Уровень 1. Нуб. Решенных задач 10-50

Как определить

100% решаемых задач на этом уровне — Easy.

Вы уже можете решить задачки с уровнем Acceptance 70-80% брут форсом в любимой среде разработки. Понимаете самые простые структуры данных — массивы, словари, связные списки, очереди, стек. Алгоритмы вы, конечно, используете, но не вникаете, что там внутри, просто набираете .sort()

Как пройти на следующий уровень

Время, которое понадобится вам, чтобы перейти на следующий уровень около 25-40 часов без перерыва.

Чтобы пройти на следующий уровень, вам нужна БАЗА. Вы должны пострадать на этом уровне, зато дальше будет куда легче. Вам нужно взять ручку и тетрадку и пойти штудировать алгоритмы и структуры данных. Предлагаю начать с изучения ресурса neetcode.io, особенно его RoadMap, потому что сам им пользуюсь и считаю лучшим ресурсом, для тех, кто вкатывается в алгоритмы.

Roadmap от Neetcode
Roadmap от Neetcode

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

Да, здесь внимательно. Если вы до этого не изучили подробно, что такое Big O, идите, пожалуйста, почитаете, проконспектируете и посмотрите несколько видео как он рассчитывается, по времени и по памяти. Ок, теперь вы понимаете, что же это были за графики Runtime и Memory после решения задач.

Теорию нужно закрепить практикой, открываете определённый раздел и решаете все Easy задачи (если хочется больше, можно перейти на вкладку Practice в NeetCode All).  И дальше по списку, изучаете теорию представленных разделов, закрепляете практикой easy задачами. На этом этапе нет смысла спускаться дальше уровня Priotity Queue - Graphs - 1DP по роадмапу.

Универсальный совет, как решать задачи, который я много раз слышал, и сам применяю на практике. Устанавливаете таймер в 45 минут, если вы за половину не решили, идёте и смотрите видео решения (алгоритм, без кода!) от NeetCode или других блогеров, пытаетесь реализовать алгоритм в коде. Если уж здесь не получилось, то внимательно переписываете решение и вникаете, что происходит в коде, дебажите и смотрите каждый шаг. Будет хорошо, если вы в комментариях к коду опишете каждый шаг, что происходит, чтобы точно удостовериться, что вы поняли решение. 

Поехали дальше!

Уровень 2. Новичок. Решенных задач 50-100

Как определить

70% решаемых задач на этом уровне — Medium, другие 30% — Easy

Вы большой молодец! По моим подсчётам (Solves problems -> beats) этот уровень достигают <25% всех программистов со всего мира.

Наконец, вы можете без подглядки решить задачу типа TwoSum брут форсом, и даже возможно, оптимально. Вы уже понимаете такие структуры данных как деревья, графы, приоритетная очередь, решали задачи разными красивыми способами: two pointers, binary search, sliding window и т.д. 

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

Как пройти на следующий уровень

Время, которое понадобится вам, чтобы перейти на следующий уровень, около 25-40 часов без перерыва.

На этом уровне нужно решать оставшиеся миддл задачи из роадмапа ниткода. По моему опыту, миддл задачи отличаются большим количеством edge cases, и более запутанными условиями задачи, алгоритмы и структуры данных такие же.  

Если на easy задаче нужно было просто использовать binary search (возможно даже что в условиях задачи это говорится прямо) для того, чтобы найти определённое число из отсортированного массива, на medium нужно сначала отсортировать (возможно, например, это может быть не просто массив, а более сложная структура данных), потом использовать binary search, потом ещё сделать какую-то манипуляцию, чтобы получить ответ. На easy догадаться, что в определённой задаче нужно использовать тот иной алгоритм в разы легче, на medium для этого нужно сначала провести какие-то манипуляции с вводными данными и дальше уже использовать алгоритм, который позволит оптимально сделать данную задачу.

На этом уровне нужно закончить с теорией Computer Science, для этого неплохо бы изучить более углубленно такие алгоритмы, как динамическое программирование, рекурсия, backtracking, greedy, алгоритм разделяй и властвуй, алгоритм флойда, алгоритм гауса, более сложные структуры данных, разные варианты деревьев, какие бывают графы и способы оптимального решения таких задач (DFS, BFS).

Популярные алгоритмы
Популярные алгоритмы

По мере решения задач из роадмапа, вы столкнётесь со всеми этими алгоритмами и структурами данных. Если вам хочется больше, идёте в NeetCode All и берёте задачу оттуда. Также в литкоде можно отсортировать задачи по тегам, например, динамическое программирование, Problems -> Tags.

Поиск задач определенной тематики
Поиск задач определенной тематики

Уровень 3. Любитель. Решенных задач 100-300

Как определить

90% решаемых задач на этом уровне — Medium, 5% — Easy, 5% — Hard

Когда у вас 100 решённых задач вы уже должны знать все алгоритмы и структуры данных, которые могут попасть в 99% задач на литкоде и, в общем, в алгоритмических секциях на собеседованиях. Уровень написания вашего кода должен быть доведён до автоматизма, вы должны быстро понимать какая структура данных, как пройтись, как изменить определённый элемент, какими способами лучше решать оптимально задачу на ту или иную структуру данных, как работает рекурсия, в каком месте ставить указатели, как определить миддл из массива чисел, как крутить деревья в конце концов! Вы должны быть профи в основах Computer Science. Если это еще не так, стоит остановиться и пройтись по всей теории, чтобы больше не тратить на нее время, потому что дальше будет только практика. Прочитать можно, например, эту книжку, она легко читается, но я бы посоветовал еще почитать другие статьи и посмотреть несколько видео.

Грокаем алгоритмы от Адитья Бхаргава
Грокаем алгоритмы от Адитья Бхаргава

Как пройти на следующий уровень

Время, которое понадобится вам, чтобы перейти на следующий уровень около 150-200 часов без перерыва

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

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

На собеседовании у вас будет 45 минут на решение задачи, это вместе с объяснением условий задачи. На этом этапе вам нужно стремиться к решению задачи оптимальным способом за 25 минут, потому что собеседующий может добавить follow up к задаче и вы должны его решить в изначальное отведенное время. Достигаете 300 задач и поехали дальше! 

Уровень 4. Эксперт. Решенных задач 300-1000

Как определить

70% решаемых задач на этом уровне — Medium, 25% — Hard, 5% — Easy

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

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

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

 Вот по каким критериям оценивает Google (от ex googler):

  1. Алгоритмы. В начале, не написав ни строчки кода, вы должны объяснить, как вы будете решать эту задачу, какие алгоритмы и структуры данных будете использовать, какая сложность по времени и памяти у них. Сначала лучше предложить брут форс решение, если есть несколько оптимальных, предложить все.

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

  3. Коммуникация. Это самое сложная часть для всех не англоговорящих или просто интровертов. Вы должны комментировать каждую написанную вами строчку, почему вы ее пишете и к чему она приведет. Также вы должны разговаривать на общие и профессиональные темы по ходу интервью, здесь могут проверять ваши софт скиллы, даже не дойдя до этапа behavioral.

  4. Способ решения проблемы. Вы с самого начала должны по полочкам расставить условия задачи и задавать уточняющие вопросы и выяснить, какие edge cases могут быть. По мере написания кода вы должны разделять задачи на подзадачи, если это нужно, не писать сумбурно и все переписывать, ваш алгоритм должен быть понятен собеседующему на 100%.

В скрине ниже описана структура, как оценивается кандидат в Гугл. Скрин взят отсюда - начиная от 52:00

Метрики оценки на алго секции от бывшего работника Google
Метрики оценки на алго секции от бывшего работника Google

Также на данном этапе лучше начать проводить мок интервью, если вы целенаправленно готовитесь к собеседованиям. Мок интервью, позволят вам выстроить в голове структуру собеседования, отточить навык общения на английском и уменьшить стресс уже при прохождении реального интервью. По совету бывалых, нужно, от 10 до 50 мок интервью, чтобы довести этот навык до автоматизма.

Как пройти на следующий уровень

Время, которое понадобится вам, чтобы перейти на следующий уровень около 300-600 часов без перерыва

Здесь остановка для всех, кто хочет попасть любую FAANG+ компанию. Дальше есть смысл идти только, если вы действительно увлечены спортивным программированием и хотите стать чемпионами мира или выигрывать другие соревнования.

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

Господа, здесь моя остановочка, дальше сами!

Уровень 5. Бог. Решенных задач 1000+

Как определить

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

Как пройти на следующий уровень

To infinity and beyond?

Buzz Lightyear
Buzz Lightyear

Комментарии (18)


  1. dakuan
    29.01.2023 15:38
    +5

    Вы какие-то ужасы рассказываете, ну либо за последние годы требования серьезно выросли.
    1000 задач - это уже серьзное задроство, которым имеет смысл заниматься только если нравится сам процесс. Мне кажется, что для получения оффера в FAANG это избыточно. Я никогда настолько сильно не задрачивался - решил, может быть, 100 или около того задач. В большинстве случае от соискателя и не ждут, что он сходу придумает решение на уровне победителя олимпиады и сразу накатает на доске безупречный код без единой ошибки, никуда не подглядывая. Цель таких собеседований - проверить способность соискателя анализировать и решать неизвестные задачи. Я во время подготовки просто утром выбирал какую-нибудь задачку и по дороге на работу не спеша обдумывал возможные подходы к ее решению. В большинстве случаев, когда добирался до работы, у меня уже было в голове какое-то решение. Естественно, оно почти всегда было прямолинейным и далеким от оптимального. Уже после этого начинал обдумывать, что в нем можно улучшить и как вписаться в требования по производительности. На собесах действовал точно так же, только шаг 1 проговариал вслух и потом так же анализировал вслух слабые места предложенного решания и возможные способы их устранения.
    Но повторюсь, это было лет почти 10 лет назад, может быть, сейчас FAANG совсем зажрались и чтобы к ним попасть нужно действительно так заморочиться.


    1. kotsev96 Автор
      29.01.2023 16:29

      Спасибо, что поделились своим опытом!

      Да, согласен, чтобы попасть в FAANG подобную компанию 1000 это слишком. В статье я пишу, что оптимально, если вы решили около 500, но подаваться можно и с 250 - 300.

      И да, я думаю, что сложность собеседований скорее выросла, исходя даже из того факта, что сейчас желающих войти в айти гораздо больше, чем 10 лет назад, соответственно, больше желающих = более жесткий отбор.


      1. Metotron0
        29.01.2023 16:57
        +3

        А что, желающие войти вытаются сделать это через Фейсбук и Гугл?


        1. s_f1
          29.01.2023 18:56

          Целовать – так королеву, воровать – так миллион.


          1. Metotron0
            30.01.2023 03:13
            +3

            Всё равно не понятно, как люди, которые только хотят войти, создали конкуренцию людям с 500 задачами, что им пришлось решать аж по 1000.


      1. xaosxaos2
        31.01.2023 10:41

        А как отличить, что человек сам решил или просто зашел в решенное и скопировал решение и выдал за своё? То есть налицо без проблем сделать себе нужное.


      1. iboltaev
        31.01.2023 13:55

        Чето 500 это тоже овердофига. Есть мнение, что достатрчно 150.

        Мне, если что, больше моих 104 решать уже лень.


  1. s_f1
    29.01.2023 16:53

    У меня вопрос.
    Если на 49-ти задачах на уровне Нуб 100% задач – easy, то как на 51-ой задаче на уровне Новичок 70% оказываются уровня medium?


    1. kotsev96 Автор
      29.01.2023 17:03

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


  1. Joric
    29.01.2023 21:53

    Во первых, статья заказная, реклама какого-то neetcode. Во вторых - я уже устал читать про количество задач. Можно за день скопировать хоть 2000 задач из форума который в одном клике рядом. Единственная метрика которой можно доверять - это рейтинг на контестах в том же литкоде, там условия приближенные к боевым - 4 задачи за полтора часа (из них 1-2 харда) считается время, потраченное на решение и решения не нагуглить. А просто количество задач - это ничто, фикция, меньше чем ничего.


    1. Hixon10
      30.01.2023 01:30
      +2

      Единственная метрика, которой можно доверять — количество офферов в почтовом ящике :)


    1. Woody_side
      30.01.2023 09:24
      +4

      Любое упоминание качественного сервиса или ресурса в любой статье делает эту статью автоматически заказной, я правильно вас понимаю?


  1. YLincoln
    30.01.2023 09:25

    Спасибо большое за статью! Очень информативно, особенно для самых маленьких и тупых, но целеустремленных


  1. vl4deee11
    30.01.2023 09:25
    +3

    every day =)


    1. Joric
      30.01.2023 10:58
      +2

      А у меня стрик 1035 дней (2 года, 10 месяцев и 1 день). Жалко он там не рисуется нигде. И три футболки. https://leetcode.com/joric/


  1. andreyNN
    31.01.2023 11:16

    Если цель готовиться к собеседованиям то я бы добавил пару пунктов.
    1. Разные компании спрашивают разные задачи, стоит поискать список задач для конкретной компании (за деньги можно посмотреть в премиуме литкода).
    2. Решение на листочке или в базовом редакторе онлайн не имеет ничего общего с решениями в IDE без таймера.

    >На этом этапе вам нужно стремиться к решению задачи оптимальным способом за 25 минут, потому что собеседующий может добавить follow up к задаче и вы должны его решить в изначальное отведенное время.

    Я бы сразу начинал с 25 минут и белого листа.
    3. Стоит повторять задачи, если вы полгода назад могли записать задачу на листе, не факт что сможете сегодня. Как минимум проговаривать как в пункте

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


    1. Joric
      01.02.2023 08:50

      Решение на листочке или в базовом редакторе онлайн не имеет ничего общего с решениями в IDE без таймера.

      Вот труъ. Для собеседований нужно прокачивать стресс в первую очередь, а это контесты и моки. Все моё бесконтрольное "осознанное обучение" сводилось к тому что я копипастил решение очередной задачи и переходил к следующей, в 90% случаев. Ну и мозг ничего не запоминает толком без стресса.


  1. Lolka555
    31.01.2023 20:19

    А как себя оценить в случае если решаешь задачи а-ля Leetcode на том же Codeforces/Codechef/ACMP?