Всем салют!
Хочу рассказать вам историю о том, как я начинал с уровня — «не могу решить даже 1 easy задачу из 10» до уровня — «могу решить каждую вторую medium задачу» и прошел несколько coding сессий в таких компаниях как Meta, Booking, Careem, Avito...
Началось все с того, что в конце 2022 года я твердо решил, что хочу устроиться в FAANG компанию, но для этого, как вы наверно все знаете, нужны знания алгоритмов и структур данных, коих у меня не было, потому что в обычной работе тебе не нужны heap, tree, disjoint set и другие структуры данных, поэтому начать пришлось практически с нуля.
Было очень тяжело, т.к. не знал с чего начинать, по какому принципу решать задачи, что важно, а что не очень, сколько нужно решить задач, чтоб чувствовать уверенность, получится ли вообще перейти на medium задачи, т.к. решение даже easy задач заводило в тупик, ниже постараюсь ответить на все эти вопросы.
Самое первое, что приходит в голову, когда хочешь начать решать задачи на литкоде — это открыть страницу с задачами https://leetcode.com/problemset/all/ и начать решать их подряд, но это не очень хорошая идея, даже если вы применили фильтр easy, потому что очень много задач с пометкой easy очень сложно решить и это может сильно демотивировать, а то и понизить самооценку.
-
Первый совет - обращайте внимание на процент Acceptance, чем этот процент больше, тем лучше, потому что это означает, что у многих людей получается решить эту задачу и есть вероятность, что и у вас получится.
-
Второй совет - начинайте с самых фундаментальных структур данных, таких как array(одномерный/двумерный), set, hashmap, они будут встречаться вам постоянно, к примеру, во многих задачах время выполнение можно улучшить добавив set или hashmap(но нужно учесть, что увеличится потребление памяти) и только после того как освоите их, можно начинать углубляться в другие структуры как stack, queue, linked list, tree, graphs
https://neetcode.io/roadmap - тут есть roadmap с темами и задачами, очень советую
https://www.techinterviewhandbook.org/grind75 - можно создать понедельный план с применением различных фильтров
https://seanprashad.com/leetcode-patterns/ - список из 150 популярных задач, разделенные на темы, сложность и компании -
Третий совет - если не можете придумать оптимальное решение, начинайте с решения "в лоб", как только получится, подумайте над тем, как это решение можно улучшить, может можно использовать какую-то структуру? может массив можно отсортировать? а что если использовать set или hashmap? можно или использовать какой-то шаблон
-
Четвертый совет - пройдитесь по этим 14 шаблонам https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed , особенно уделите внимание two pointers, sliding window и fast & slow pointers, т.к. они чаще всего встречаются
-
Пятый и самый важный совет - практика, практика и еще раз практика, в начале мне хотелось каждый раз плакать от своей тупости, потому что не мог решать даже простые задачи и это не преувеличение, фраза - "какой же я тупой" не уходила из головые первые несколько месяцев
Минус литкода решили на этой платформе https://firecode.io/ , где задачи даются один за другим, начиная с легких и повторяя уже решенные задачи, чтоб закрепить. Есть объяснение разных тем, после решения задачи можно посмотреть как другие решили, что очень полезно, т.к. ты видишь разные подходы решения одной и той же задачи.
FAQ:
-
Что делать, если не получается решить задачу?
Если после 30-40 минут у вас не получилось решить задачу, то посмотрите решение, попробуйте найти видео решение этой задачи, как только посмотрели и разобрали, попробуйте решить заново, если не получилось, еще раз посмотрите и так по кругу. Время от времени возвращайтесь к старым задачам и решайте их заново, особенно если решение какой-то задачи далось вам с трудом.
Я порой одну и ту же задачу решал по 10-15 раз, а то и больше -
Сколько задач нужно решить, чтобы начать откликаться на вакансии?
Тут все индивидуально, я полгода каждый день решал(сам или с помощью видео) несколько задач, решил где-то 300 задач и только в этот момент почувствовал почву под ногами, а уверенность почувствовал только после решение где-то 400-500 задач. Некоторым достаточно и 100-200 задач, к сожалению я не из их числа. -
Какой язык программирования выбрать для решения задач?
Если коротко - 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 и т.д.), время тратишь именно на решение задачи, а не на печатания и прочее, скорость на собеседовании очень важна. -
Как найти время на задачи?
В моем случае я старался решать по 2 задачи в день, одну задачу до начала работы и вторую задачу после работы. На выходных уделял больше времени, смотрел видео, читал статьи, старался решать больше задач, также старался повторно решать старые задачи, чтобы закрепить тему и задачу. -
Нужно ли покупать leetcode premium?
Самое полезное у premium - вы можете посмотреть в каких компаниях давали ту или иную задачу, если вы готовитесь к конкретной компании, то рекомендую, иначе достаточно бесплатной версии, т.к. видео объяснение задачи можно найти на канале Neetcode(ссылка ниже) и т.д.
-
Стоит ли покупать доступ к educative.io?
Очень много видел рекомендаций курса Grokking Coding Interview Patterns от educative, но не нашел этот курс очень полезным, единственное понравилось визуальное объяснение, но на мой взгляд лучше посмотреть видео на ютуб -
Стоит ли покупать доступ к algoexpert.io?
На мой взгляд очень полезный ресурс, для каждой задачи есть подробное объяснение, чуть ли не каждое видео по 30-50 минут. На сайте постоянно проходят разные акции и можно ухватить все курсы на год за 99$, адекватная цена, приятный сайт, много тест кейсов для задач и сам редактор приятный и удобный
Полезные ссылки:
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 - много рекомендаций, сам не проходил
Автор: Suleiman Dibirov