В этой статье я хочу написать про мой опыт взаимодействия с платформой 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.
Смотрите на первые 20 задач и решаете те, которые вам понравились, нужно решить около 10. Решать без разницы как, можно самым глупым брутфорсом, в своей любимой среде со всеми подсказками (но не надо, пожалуйста, использовать ChatGPT:), главное - пройти тесты и почувствовать наконец вкус победы на литкоде. Самый лучший путь к мотивации это маленькие победы, не забывайте об этом, поехали дальше!
Уровень 1. Нуб. Решенных задач 10-50
Как определить
100% решаемых задач на этом уровне — Easy.
Вы уже можете решить задачки с уровнем Acceptance 70-80% брут форсом в любимой среде разработки. Понимаете самые простые структуры данных — массивы, словари, связные списки, очереди, стек. Алгоритмы вы, конечно, используете, но не вникаете, что там внутри, просто набираете .sort()
Как пройти на следующий уровень
Время, которое понадобится вам, чтобы перейти на следующий уровень около 25-40 часов без перерыва.
Чтобы пройти на следующий уровень, вам нужна БАЗА. Вы должны пострадать на этом уровне, зато дальше будет куда легче. Вам нужно взять ручку и тетрадку и пойти штудировать алгоритмы и структуры данных. Предлагаю начать с изучения ресурса neetcode.io, особенно его RoadMap, потому что сам им пользуюсь и считаю лучшим ресурсом, для тех, кто вкатывается в алгоритмы.
Выбираете первый раздел, что же там? Ах да, массивы. Если вы поймали себя на мысли, что да пф-ф, что там массивы, что я там не видел, то, пожалуйста, прошу, пойдите и почитайте несколько статей, проконспектируете, порисуете, вбейте в голову, как выглядит этот самый массив, никогда не будет лишним освежить свои знания. Также изучите сложность вставки, удаления и чтения.
Да, здесь внимательно. Если вы до этого не изучили подробно, что такое 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):
Алгоритмы. В начале, не написав ни строчки кода, вы должны объяснить, как вы будете решать эту задачу, какие алгоритмы и структуры данных будете использовать, какая сложность по времени и памяти у них. Сначала лучше предложить брут форс решение, если есть несколько оптимальных, предложить все.
Кодинг. Вы должны озвученные ранее мысли по решению задачи изложить в коде. В идеале вы должны написать хорошо читаемый код с хорошо именованными переменными, методами и т.д. Ну и, конечно, написанный код должен работать и покрывать все кейсы, даже если вы его не запустите, что, скорее всего, будет так, так как вы будете все писать на пустом листке, без всяких подсвечиваний синтаксиса (лучше готовится к этому, если вам предложат писать в каком-то онлайн-редакторе кода, будем считать, что вам повезло).
Коммуникация. Это самое сложная часть для всех не англоговорящих или просто интровертов. Вы должны комментировать каждую написанную вами строчку, почему вы ее пишете и к чему она приведет. Также вы должны разговаривать на общие и профессиональные темы по ходу интервью, здесь могут проверять ваши софт скиллы, даже не дойдя до этапа behavioral.
Способ решения проблемы. Вы с самого начала должны по полочкам расставить условия задачи и задавать уточняющие вопросы и выяснить, какие edge cases могут быть. По мере написания кода вы должны разделять задачи на подзадачи, если это нужно, не писать сумбурно и все переписывать, ваш алгоритм должен быть понятен собеседующему на 100%.
В скрине ниже описана структура, как оценивается кандидат в Гугл. Скрин взят отсюда - начиная от 52:00
Также на данном этапе лучше начать проводить мок интервью, если вы целенаправленно готовитесь к собеседованиям. Мок интервью, позволят вам выстроить в голове структуру собеседования, отточить навык общения на английском и уменьшить стресс уже при прохождении реального интервью. По совету бывалых, нужно, от 10 до 50 мок интервью, чтобы довести этот навык до автоматизма.
Как пройти на следующий уровень
Время, которое понадобится вам, чтобы перейти на следующий уровень около 300-600 часов без перерыва
Здесь остановка для всех, кто хочет попасть любую FAANG+ компанию. Дальше есть смысл идти только, если вы действительно увлечены спортивным программированием и хотите стать чемпионами мира или выигрывать другие соревнования.
На LeetCode проходят много соревнований и челленджей начиная от ежедневных задач, которые вам дает литкод, заканчивая мировыми соревнованиями, где вам на время нужно решать несколько задач.
Господа, здесь моя остановочка, дальше сами!
Уровень 5. Бог. Решенных задач 1000+
Как определить
Вы это и так знаете, лучше поделитесь в комментариях лайфхаками, как эффективно обучаться и стать такими, как вы.
Как пройти на следующий уровень
To infinity and beyond?
Комментарии (18)
s_f1
29.01.2023 16:53У меня вопрос.
Если на 49-ти задачах на уровне Нуб 100% задач – easy, то как на 51-ой задаче на уровне Новичок 70% оказываются уровня medium?kotsev96 Автор
29.01.2023 17:03Тут я имею ввиду, что от начала и до конца определенного уровня, нужно решать такой-то тип определенных задач.
Joric
29.01.2023 21:53Во первых, статья заказная, реклама какого-то neetcode. Во вторых - я уже устал читать про количество задач. Можно за день скопировать хоть 2000 задач из форума который в одном клике рядом. Единственная метрика которой можно доверять - это рейтинг на контестах в том же литкоде, там условия приближенные к боевым - 4 задачи за полтора часа (из них 1-2 харда) считается время, потраченное на решение и решения не нагуглить. А просто количество задач - это ничто, фикция, меньше чем ничего.
Hixon10
30.01.2023 01:30+2Единственная метрика, которой можно доверять — количество офферов в почтовом ящике :)
Woody_side
30.01.2023 09:24+4Любое упоминание качественного сервиса или ресурса в любой статье делает эту статью автоматически заказной, я правильно вас понимаю?
YLincoln
30.01.2023 09:25Спасибо большое за статью! Очень информативно, особенно для самых маленьких и тупых, но целеустремленных
vl4deee11
30.01.2023 09:25+3every day =)
Joric
30.01.2023 10:58+2А у меня стрик 1035 дней (2 года, 10 месяцев и 1 день). Жалко он там не рисуется нигде. И три футболки. https://leetcode.com/joric/
andreyNN
31.01.2023 11:16Если цель готовиться к собеседованиям то я бы добавил пару пунктов.
1. Разные компании спрашивают разные задачи, стоит поискать список задач для конкретной компании (за деньги можно посмотреть в премиуме литкода).
2. Решение на листочке или в базовом редакторе онлайн не имеет ничего общего с решениями в IDE без таймера.
>На этом этапе вам нужно стремиться к решению задачи оптимальным способом за 25 минут, потому что собеседующий может добавить follow up к задаче и вы должны его решить в изначальное отведенное время.
Я бы сразу начинал с 25 минут и белого листа.
3. Стоит повторять задачи, если вы полгода назад могли записать задачу на листе, не факт что сможете сегодня. Как минимум проговаривать как в пункте
>В начале, не написав ни строчки кода, вы должны объяснить, как вы будете решать эту задачу, какие алгоритмы и структуры данных будете использовать, какая сложность по времени и памяти у них.Joric
01.02.2023 08:50Решение на листочке или в базовом редакторе онлайн не имеет ничего общего с решениями в IDE без таймера.
Вот труъ. Для собеседований нужно прокачивать стресс в первую очередь, а это контесты и моки. Все моё бесконтрольное "осознанное обучение" сводилось к тому что я копипастил решение очередной задачи и переходил к следующей, в 90% случаев. Ну и мозг ничего не запоминает толком без стресса.
Lolka555
31.01.2023 20:19А как себя оценить в случае если решаешь задачи а-ля Leetcode на том же Codeforces/Codechef/ACMP?
dakuan
Вы какие-то ужасы рассказываете, ну либо за последние годы требования серьезно выросли.
1000 задач - это уже серьзное задроство, которым имеет смысл заниматься только если нравится сам процесс. Мне кажется, что для получения оффера в FAANG это избыточно. Я никогда настолько сильно не задрачивался - решил, может быть, 100 или около того задач. В большинстве случае от соискателя и не ждут, что он сходу придумает решение на уровне победителя олимпиады и сразу накатает на доске безупречный код без единой ошибки, никуда не подглядывая. Цель таких собеседований - проверить способность соискателя анализировать и решать неизвестные задачи. Я во время подготовки просто утром выбирал какую-нибудь задачку и по дороге на работу не спеша обдумывал возможные подходы к ее решению. В большинстве случаев, когда добирался до работы, у меня уже было в голове какое-то решение. Естественно, оно почти всегда было прямолинейным и далеким от оптимального. Уже после этого начинал обдумывать, что в нем можно улучшить и как вписаться в требования по производительности. На собесах действовал точно так же, только шаг 1 проговариал вслух и потом так же анализировал вслух слабые места предложенного решания и возможные способы их устранения.
Но повторюсь, это было лет почти 10 лет назад, может быть, сейчас FAANG совсем зажрались и чтобы к ним попасть нужно действительно так заморочиться.
kotsev96 Автор
Спасибо, что поделились своим опытом!
Да, согласен, чтобы попасть в FAANG подобную компанию 1000 это слишком. В статье я пишу, что оптимально, если вы решили около 500, но подаваться можно и с 250 - 300.
И да, я думаю, что сложность собеседований скорее выросла, исходя даже из того факта, что сейчас желающих войти в айти гораздо больше, чем 10 лет назад, соответственно, больше желающих = более жесткий отбор.
Metotron0
А что, желающие войти вытаются сделать это через Фейсбук и Гугл?
s_f1
Целовать – так королеву, воровать – так миллион.
Metotron0
Всё равно не понятно, как люди, которые только хотят войти, создали конкуренцию людям с 500 задачами, что им пришлось решать аж по 1000.
xaosxaos2
А как отличить, что человек сам решил или просто зашел в решенное и скопировал решение и выдал за своё? То есть налицо без проблем сделать себе нужное.
iboltaev
Чето 500 это тоже овердофига. Есть мнение, что достатрчно 150.
Мне, если что, больше моих 104 решать уже лень.