С наступающим, Хабр.

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

Конечно, про литкод все слышали и, казалось бы, о чём тут рассказывать? Ну задачник, ну перед техсобесами можно открыть на день-два. Но для того рассказать и стоит, дабы чуть разбавить это мнение.

С сайтом несколько больно знакомиться, он отпугивает вездесущими приписками "premium", пользуясь славой ресурса для техсобесов продвигает функционал вроде списков компаний, где встречался вопрос n и симуляции интервью в компанию m, да и сам не особо стремится рассказать о себе, потому в нём зачастую и видно голый задачник с одной страницей "problems".

За всем этим теряется важный пункт – а можно ли использовать сайт не для механического зазубривания популярных вопрос-ответов, а для изучения/закрепления алгоритмов и структур данных? Можно. Но подход к этому нужно формировать самостоятельно.

Тему «а кому вообще нужны алгоритмы» и её более радикальную вариацию мы затрагивать не будем, в этой священной войне уже немало копий сломано. Если вы открыли этот пост, как минимум вы допускаете, что кому-то да нужны.

На сайте присутствует платная подписка, которая закрывает часть контента. Не считая влияния на UI, это не критично, бесплатной части нам хватит, к тому же подписку можно получить и бесплатным способом, о чём мы также поговорим. Но, чтобы каждый раз не уточнять, какая часть подписочная, а какая общая – платный функционал я буду помечать [квадратными скобками].

Материал предполагается как точка входа для незнакомых с сайтом, а описание разделов содержит детали, которые не упомянуты даже в официальном faq, хотя должны бы.

Но сначала несколько общих фраз.

Что вообще может дать литкод?

  • Знание алгоритмов и структур данных – 7/10

    • И о задачах мы тут говорим только во вторую очередь. Задачи – инструмент закрепления знаний, но для этого их нужно получить, и, крайне желательно, структурировано. На сайте есть специальные разделы посвящённые этому. Не полные, но в качестве вводной в определённую тему вполне подойдут. Дальнейшее ознакомление с теорией остаётся в качестве домашней работы.

    • Отдельно стоит отметить сообщения в разделе обсуждений к задачам, которые некоторыми пользователями пишутся с размахом небольшого гайда по конкретной теме. Также бывают весьма полезны, с учётом того, что эти сообщения пропущены пользователями "через себя" – как они пришли к пониманию темы.

  • Понимание применимости алгоритмов на практике – 10/10

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

    • Один из примеров – тема бинарного поиска. Сначала сайт знакомит с базовым представлением – вот отсортированный массив, вот target, вперёд. Потом вам предлагают сделать то же с матрицей, с повёрнутым массивом, и с прочими усложнёнными вариациями. А потом из входных данных пропадает и массив для ожидаемого поиска, и target, в виде простого значения из него. Теперь вы сами формируете и последовательность, и условие поиска, отталкиваясь от прочих входных данных, для задачи, которая, на первый взгляд, никак к изучаемой теме не относилась. Такие моменты, когда вы открываете новые подходы, неважно какого уровня сложности, всегда приятные.

  • Оценка входных данных, тесткейсов, сложности задачи и собственных сил – 7/10

    • Правильно определить границы работы кода и продумать краевые случаи – обязательный пункт любого решения. Причём если последние зачастую исправляются парой дополнительных условий с досрочным выходом, то первые могут повлиять на весь подход к решению.

    • Литкод также неплохо помогает бороться с крайностями "я всё/ничего не знаю", что никогда не бывает лишним. Досада от не найденного или явно плохого решения будет иногда возникать, но это неотъемлемая часть обучения. Зато к таким задачам приятно возвращаться снова, чувствуя разницу в силах.

  • Навык чтения и оценки кода – 5/10

    • «Код пишется один раз, а читается сотни». И данный ресурс не исключение. Вам, помимо собственных прошлых решений, так или иначе придётся часто обращаться к чужим решениям – для сверки решения, подсказки, поиска альтернативных подходов. А там вы обнаружите самый разнообразный код – на разных языках, в разных стилях, с устаревшими и только набирающими популярность подходами, и, конечно, от пользователей с разным уровнем подготовки. Вы привыкнете быстро оценивать качество как самого кода, так и подхода к решению, подмечать фрагменты, которые можно оптимизировать, и станете больше ценить читаемость в собственных решениях.

  • Английский и прочие смежные темы – 2/10

    • Всё что выше и ниже – не на великом и могучем, а на английском, ближе к "техническому". Неплохая подспудная практика. Что же касаемо прочих тем – тут стоит выделить задачи с тегами Database и Math. Первые – задачи на SQL, и left join'ами они не ограничиваются. Задачи из второго тега обычно отсылают к соответствующим знаниям, но куда интереснее задачи, в которых прямое решение, растягивающееся на 50+ строк, доказывается математически и сворачивается до пары-тройки выражений. Литкод также пытался и в другие темы, вроде shell'a, и хоть пока там всего 4 задачи, но намётки есть.

  • Знание стандартной библиотеки и синтаксических хитростей – 2/10

    • При решении алгоритмических задач вы с куда большей вероятностью столкнётесь с теми особенностями вашего ЯП, которые обычно упускаются при решении задач другого толка.

  • Преимущество при трудоустройстве – 1/10 и 10/10

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

    • Ну а про алгоритмическую секцию комментарии излишни – решайте задачи, и все вопросы ваши, особенно с учётом того, что нередко их с литкода-то и берут (или же они впоследствии на него попадают). Обилие историй успеха по одноимённому запросу это только подтверждает.

    • Также литкод дополнительно ведёт статистику самых популярных вопросов на собеседованиях [и любимых вопросов в FAANG'е, и вы можете подготовиться даже к собеседованию в выбранную компанию].

Но пора бы уже перейти и к наполнению сайта.

В общем о задачах

Задачи составляют основу сайта и могут быть доступны из разных разделов. На сегодняшний день доступно 2000 [+530] задач, в их числе 45 [+175] для SQL и по 5 на shell и concurrency. Для алгоритмических задач, для решения предлагается 18 языков. Для SQL доступен выбор между MySQL, MS SQL Server и Oracle. Все задачи условно разделены на три уровня сложности, с приблизительным распределением 1easy/2medium/1hard.

Список постоянно растёт, в среднем на 1 задачу в день. Если более подробно – каждую неделю проводится турнир (о нём поговорим ниже) с 4 новыми задачами (1e/2m/1h), после окончания которого эти задачи включаются в общий список. Каждые две недели, помимо еженедельного, проводится biweekly турнир, по тому же механизму. [Дополнительно к этому в неделю добавляются 1-2 задачи.] Итого за 2 недели получается 12 [+2-4] новых задач.

Что есть на сайте

Problems / общий список

Тот самый раздел, который обычно и ассоциируется с сайтом. Давайте поскорее от него отойдём.

Из востребованного кликабельного: тут есть фильтры по тегам, статусу и сложности; сортировка по проценту принятия (количество принятых решений ÷ количество отправленных решений). Комбинацией этих фильтров можно подбирать задачи по уровню и интересу.

Если задача решается в прочих разделах, она помечается решённой и в общем списке. Но не наоборот.

Собственно, и всё. Двигаемся дальше.

Study plan

Относительно новый функционал. Добавился чуть более года назад, и с тех пор регулярно дополняется.

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

Каждый план разделён на 3 самостоятельных уровня*. Конечно, чем глубже уровень, тем на большее количество дней он рассчитан, и тем сложнее в нём задачи. Выполнение каждого уровня каждого плана подкрепляется отдельным бейджиком в профиле участника и открывает доступ к следующему уровню соответствующего плана. Последние уровни каждого плана – [].

После запуска уровня у вас будут открываться по 2-3 задачи в день, вне зависимости от того, решили ли вы задачи предыдущих дней. Если по истечении последнего дня уровня у вас выполнены все задачи – уровень засчитывается как пройденный, даже если вы решили все задачи в последний день (настоятельно не рекомендуется). Если же вы не закрыли n задач уровня – придётся запускать с первого дня. Самостоятельно прервать уровень нельзя*.

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

Несколько планов можно начать одновременно, но не уровни одного плана. Злоупотреблять этим я бы не советовал. Последовательное выполнение уровней планов отлично работает. Если желание спринтить уж слишком велико – 2 уровня одновременно допустимы, 3 – однозначный максимум, иначе вы просто накопите "хвосты" к последнему дню, и ничего хорошего из этого не выйдет.

При последовательном выполнении 13 бесплатных уровней со всех планов занимают 214 дней и предлагают до 485 задач, с распределением сложности 191e/283m/11h. [Для последних уровней – 242 дня и до 565 задач (34/312/219).]

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

Explore

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

Учебник разделён на две области – подготовка к тех.собеседованиям и изучение самих тем АиСД. На главной представлены по [8] тем из каждой области[[, первые из которых дополнительно платные сверх подписки, господи]]. Интересное же завёрнуто под "more" каждой области. Там мы найдём 8 полностью бесплатных тем и 13 с незначительными ограничениями. Рекомендую сразу прокликать их в избранное для быстрого доступа.

Открытые темы:
  • Learn

    • The LeetCode Beginner's Guide – free

    • Arrays 101 – 30/31

    • Sorting – free

    • Linked List – 26/30

    • Binary Tree – 16/19

    • Recursion I – 20/21

    • Recursion II – 23/25

    • Machine Learning 101 – free

    • Binary Search – 28/30

    • N-ary Tree – 6/11

    • Binary Search Tree – 15/21

    • Trie – 11/14

    • Hash Table – 30/35

    • Array and String – free

    • Queue & Stack – 30/32

    • Decision Tree – free

  • Interview

    • Rock the Behavioral Interview – текст

    • Coding Interview Strategy – текст

    • Top Interview Questions (easy) – задачник – 48/48

    • Top Interview Questions (medium) – задачник – 46/52

    • Top Interview Questions (hard) – задачник – 48/51

Темы разделены на главы, состоят из страниц и задач, страницы содержат текст, видео и тесты, тут ничего необычного. Темы раздела собеседований бросаются из крайности в крайность – где-то вода, где-то голые списки задач. А вот раздел Learn весьма полезен. Суммарно в разделе Learn вам предложат 190 задач (без учёта повторений) и 142 в Interview.

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

Lists

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

В разделе "problems" литкод предлагает 8 собственных списков, но это просто "топы": 100 самых рейтинговых вопросов, 150 самых частых вопросов на интервью, топ вопросов в компанию n. Пройтись по ним перед собеседованием можно, но в них нет ни структуры, позволяющей использовать их для определения общего порядка решения, ни игрового стимула, даже отметки выполнения нет. К тому же, из 8 существующих официальных списков – 6 в квадратных скобках, один в полуквадратных, и только "Top 100 Liked Questions" может быть выполнен полностью.

Assessment

Раздел, на котором вы можете запустить симуляцию технического собеседования с 2, 3 или 4 вопросами, в любом варианте – по 30 минут на каждый вопрос. Вопросы случайно выбираются из списков – общего [и по конкретной компании]. При прохождении вопросов вы не видите их названия и номера, а также в тестах не отображается ожидаемый вывод.

По завершении симуляции (полное решение, истечение времени, досрочный выход) сайт предоставит оценку вашего решения данного набора задач. Решённые задачи также отметятся в общем списке задач.

Требует уточнения, но, кажется, задачи для симуляции подбираются из числа нерешённых ранее. После нескольких симуляций появится доступная только вам оценка навыков по 8 темам – массивы и строки, деревья и графы, рекурсия, ….

Раздел с сомнительной полезностью, разве что для интереса раз в полгода можно и пройти.

Contest

Каждое воскресенье в 5:30 утра по МСК (так уж получилось) и каждую вторую субботу в 17:30 (в дополнение к воскресному) начинается турнир с 4 задачами на полтора часа. Соотношение условной сложности привычное – 1e/2m/1h. Задачи всегда новые, ни готовых решений в интернете, ни вкладки обсуждения нет. Каждая задача оценивается в некоторое количество баллов, обычно 3/4/5/6, 3/4/4/6 или 3/5/5/6.

Есть особенности и со стороны проверки решения:

  • некоторые тесты при срабатывании скрывают, какой ответ ожидается или на каких входных данных произошло срабатывание, что может сильно помешать в отлове ошибки

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

Для формирования таблицы результатов используется сумма баллов за решённые задачи, вспомогательная сортировка происходит по времени затраченному на решения (по времени последнего правильного решения). Также ко времени добавляется по 5 "штрафных" минут за каждое отправленное неправильное решение (только для решённых задач). Не стоит недооценивать штрафное время, оно может существенно повлиять на вашу итоговую позицию.

В зависимости от занятого места меняется ваш общий турнирный рейтинг. Так как вопросы, даже при условном делении на e/m/h, из турнира в турнир будут отличаться по сложности, может сложиться так, что 4/4 решённых задач в лёгком турнире, где все выступили хорошо, дадут меньшую прибавку к рейтингу, чем 2/4 в сложном, ведь влияет ваша позиция относительно других участников. Прибавка к рейтингу конечно зависит и от ваших прошлых результатов. Подробнее о подсчёте рейтинга с формулами можно почитать здесь.

Для участия необходимо зарегистрироваться на странице конкретного турнира, по желанию заполнив анкету или нажав в "continue to register". Сделать это можно хоть за неделю до начала, хоть за минуту, а можно присоединиться и к уже начавшемуся турниру, но время окончания у вас будет общее со всеми.

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

По завершению турнира вопросы отправляются в общий список, по ним открываются обсуждения, формируется предварительная таблица результатов турнира. Решённые вами на турнире вопросы в общем списке также отмечаются решёнными.

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

Участникам, с общим турнирным рейтингом входящим в 25% лучших, из числа всех участников с рейтингом 1600+, выдаётся бейджик "knight". На текущий момент это участники с рейтингом 1850+ (5.3% от всех участников). Для 5% "лучших из лучших" этот бейджик заменяется на "guardian", он на текущий момент требует 2175+ рейтинга (1.1% от общего). Если рейтинг понижается ниже требуемого, будь то неудачным выступлением, или общим повышением уровня, "guardian" обратно заменяется на "knight", а в случае последнего – сереет.

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

Некоторые турниры спонсируются определёнными компаниями. Для участников, кроме призёров, это ничего не значит – турниры не меняют ни времени, ни правил. Внеплановых турниров, пока, тоже нет.

Вы можете попробовать свои силы и без влияния на рейтинг, в удобное для вас время – на странице турниров просто начинаете virtual contest по интересующему турниру и по тем же правилам проходите его. Хороший вариант опробовать, не пора ли вам принимать участие в них. Решённые в рамках виртуального участия вопросы также учитываются в общий список.

Месячные и годовые соревнования

Игрофикация прохождения с подкреплением наградами в профиле.

В рамках месячных соревнований всем пользователям предлагается одна задача в день [и, дополнительно, одна в неделю] из общего списка. Задачи на каждый месяц выбираются администрацией сайта и каждые несколько дней держат одну тему. Сложность, обычно, нарастает к концу месяца, и к концу темы.

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

Пройденные ежедневные задачи без пропусков* образуют "стрик" пользователя – отображающийся огоньком в шапке страницы. За стрик 300+ дней в конце года выдаётся отдельный бейджик. Бейджик свежий, выдаётся только второй раз. Возможно к следующему вручению награду к нему расширят, например месячным премиумом или монетами, но это лишь догадки, хотя со стороны администрации это был бы отличный стимул. В уходящем году бейджик несколько расширили, добавив "утешительные" вариации – за 50 и 100 дней.

Монеты и подписка

Монеты – местная игровая валюта. За неё вы можете закрывать пропущенные дни в ежедневных соревнованиях – time travel ticket за 70 монет (60, так как 10 монет компенсируются выполнением пропущенного задания), обменивать на реальные вещи (футболки, блокноты, коврики для мыши), хотя сомневаюсь, что это работает в РФ, но самое интересное в этом списке – месячная подписка за 5000. Таким образом, почти все квадратные скобки выше раскрываются за активность на сайте. Накопить на неё быстро не выйдет, но в целом механизм бесплатного получения очень кстати. Итак, давайте подсчитаем, сколько и за что даётся монет:

  • Одноразовые активности

    • заполнение профиля и подключение ссылок на внешние сервисы – 60

    • первое участие в турнире – 200

    • первое прохождение тестового интервью (assessment) – 100

    • прохождение explore карточки – 25 за каждую = 200 с полностью бесплатных

    • первая публикация в обсуждениях – 50

    • Итого: 610

  • Регулярные

    • посещение сайта – 1/день

    • 30-дневный стрик посещений – 30/30дней

    • выполнение ежедневного задания – 10/день

    • участие в турнире – 5/нед +5/2нед

    • участие в еженедельном и двухнедельном турнире подряд – 35/2нед

    • призовая кнопка на странице турниров – 10/нед?

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

    • выполнение 25 ежедневных заданий календарного месяца – 25/мес

    • выполнение всех ежедневных заданий календарного месяца без использования "билета" – 50/мес

    • Итого: до 600/мес

  • Частные

    • принятое добавление вопроса – 1000

    • принятое добавление теста к вопросу – 100

    • принятое сообщение о нарушении в турнире – 100

    • принятое сообщение об ошибке в турнирном вопросе/тесте – 100

    • призовое место в турнире – от 5000 до 50, за места от 1 до 200

    • индивидуальное награждение администрацией сообщения или комментария в обсуждениях

Последнюю категорию учитывать не будем. По сути, вся активность сводится к простому выполнению ежедневных заданий без пропусков и участию в турнирах, что в сумме даст 600 монет в месяц. А это, с учётом стартового бонуса за одноразовые активности, позволит дойти до 5000 за 7.5 месяцев. Без турниров, которые начинающим могут быть ни к чему, или попросту не подходить по времени, чуть меньше – 440 (480?) монет, и соответствующие им 10 (9.2) месяцев до 5000.

Условие "без пропусков" довольно легко нарушить если не придавать ему значения, но оно даёт от 80 монет/мес, и позволяет не тратиться на билеты. Условие стоит соблюдать, тут никаких сложностей нет.

При первом получении подписки откроется к прохождению [15] тем в учебнике и ещё 13 можно будет [допройти], что дополнительно даст компенсацию в 700 монет для следующего премиума. Также станут доступны [9 из 11] уровней планов. Все 11 пройти вы просто не успеете – план Dynamic Programming включает сразу [три] уровня на 72 дня в сумме, что потребует, соответственно, трёх [месяцев] для прохождения. Ну и, конечно, премиум-вопросы, но их все спринтить за месяц тоже не стоит.

Roadmap

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

Первый вопрос – когда начать? Тут два правильных ответа: "сейчас" и "в начале месяца". Если же совпали оба – замечательно, приступайте. Начинать в первых числах месяца хорошо тем, что первые ежедневные вопросы не будут отпугивать повышенной сложностью, а игрофикация через месячное соревнование поможет удержать стартовый месяц. Да, простой набор пикселей в профиле без какой-либо реальной ценности, но это работает и поможет чуть ответственнее подойти к участию.

  • вводная неделя – начните с ежедневных заданий, посмотрите на другие разделы, решите несколько задач из списка сортировки по сложности-принятию. Запустите первый план. Общим началом будет Programming Skills или LeetCode 75. Заведите эксельку, страницу в нотионе или просто .txt, начните отмечать, насколько легко вам даются те или иные темы.

  • 0-4 мес – переходите к разделу Learn учебника, выполняйте первые уровни планов. Старайтесь подбирать планы под соответствующие темы учебника. Порядок планов, после PS и LC75, я бы предложил примерно следующий – Data Structure, Binary Search, Algorithm, Dynamic Programming, Graph Theory. Позицию для SQL оставлю за вами.

    • найдите дополнительные источники информации по теме – книги, видео, курсы, что вам больше по душе.

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

  • 5-8 мес – начинайте вторые уровни планов. Порядок выбирайте сверяясь с собственными оценками сложности тем/планов. Потихоньку закрывайте списки из explore-interview карточек.

  • точка начала уверенных регулярных участий в турнирах, если не сделали этого ранее.

  • пройдитесь по всем разделам, посмотрите, что ещё осталось или добавилось за это время.

  • 9+ мес – накопите 5000 монет. Если вы проходили прошлые пункты стабильно, не злоупотребляя выполнением заданий прошлых дней за монеты, вы должны быть близки к этому значению.
    Если нет конкретной темы, на которой вы сами хотели бы остановиться, двигайтесь по комбинации фильтров с общей страницы проблем – "todo" + желаемый уровень сложности + сортировка по acceptance.

  • 1 премиум-месяц – пройдитесь по открывшимся разделам учебника. Они будут уже не так актуальны, но пригодятся для повторения и закрепления. Пройдите некоторые открывшиеся планы. В первый премиум месяц точно стоит пройти один уровень DP. Не пытайтесь закрыть сразу все открывшиеся уровни.

  • продолжайте поддерживающее участие. Копите на второй премиум, за счёт компенсации за учебник (700) это будет чуть быстрее первого.

  • (опционально) начните прохождение на новом ЯП, одновременно закрепляя полученные ранее знания и знания второго языка.

Roadmap рассчитан на минимальное участие – 3 новые задачи в день.

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

Максимальное же значение полностью зависит от вас, но под этим я не подразумеваю "берите как можно больше". Напротив, именно последовательное, вдумчивое прохождение должно быть вашей целью. И особенно учитывая то, что литкод для вас ни в коем случае не должен быть единственным ресурсом по специальности.

Давайте приблизительно отметим 8 задач в день, в качестве предельно допустимого максимума. После него вы просто перестанете вникать в суть задач, а на дистанции и вовсе бросите.

Сам литкод отмечает в вашем профиле собственным цветом дни с определённым количеством отправленных решений. Тут немного разные значения, т.к. я говорю именно о новых задачах, а литкод учитывает все отправленные решения, включая сабмиты решённых ранее заданий и отправленные, но отклонённые решения. Всего есть 6 цветов участия за день. Конкретные цифры соотношения уровня с цветом у всех индивидуальны и зависят от предыдущих показателей пользователя. Нет информации, от каких именно, но, судя по всему, от среднего количества решений в активные дни. Пользователи, которые склонны отправлять по 2-3 решения в день, а потом, в определённый, 50+ – попросту ломают цветовое распределение в своём профиле, и дни с обычным для них участием отмечаются первым (после нулевого участия), тёмно-зелёным уровнем (бледно-зелёным для светлой темы).

Почему я обращаю ваше внимание на ничего не значащую разницу в каких-то оттенках зелёного в профиле? Потому что в этом кроется ещё одно мягкое напоминание о всем известном, но очень часто игнорируемом правиле – небольшое, но стабильное участие куда лучше, чем редкое, но до изнеможения. И, конечно, это применимо не только к литкоду.

Итак, "плановая" часть литкода завершается за 8 месяцев, дальше накопление премиума и закрытие его части. А за сколько "проходятся" все задания литкода? Тут посчитать несложно, но отталкиваться, по понятным причинам, будем от общей части, а к закрытой отнесёмся как к endgame контенту:

  • 3 в день – с учётом добавляющихся заданий – 2.5 года. За это время вы можете собрать и пройти три [премиум-месяца], а за это время снова появятся новые задания, так что, округлим вверх – 3 года. За время подписки, при той же скорости вы пройдёте 40% дополнительных вопросов.

  • 4 в день – 1.75 года, [+2мес] ≈ 2 года / [40%]

  • 5 в день – 1.25 года, [+1] ≈ 1.4 года / [25%]

  • 6 в день – 13.0 мес, [+1] ≈ 1.25 года / [30%]

  • 7 в день – 10.5 мес, [+1] ≈ 1 год / [35%]

Небольшие советы

Подсказки и готовые решения

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

Если сталкиваетесь с номерной задачей (e.g. "Path Sum III"), обратитесь к предшествующим. Если они не решены, стоит начать с них; если решены – пройдитесь глазами по решениям.

Если вы воспользовались чужим решением – обязательно построчно разберитесь, что там происходит. Если видите возможность оптимизировать отдельные конструкции или улучшить читаемость – улучшайте, в процессе вы и сами лучше разберётесь с решением.
Если решение слишком сложное – обратитесь к другому, возможно с альтернативным подходом. Не самое оптимальное, но понятное решение лучше, чем идеальная "магия".
Также оставьте в решении комментарий (в коде или через ui) себе на будущее, чтобы в следующий раз попробовать решить задачу самостоятельно. Расширенным вариантом будет оставлять комментарий ко всем решениям с собственной оценкой сложности, чтобы в дальнейшем сверять силы с прошлыми решениями.

Задания с опциональной сложностью

Обращайте внимание на follow-up приписки. Тесты пропускают решения не соответствующие им, и эта часть остаётся на ваше усмотрение, но стоит подумать о том, как можно улучшить ваше решение.

Аналогично, нередко задачи лёгкого уровня допускают грубые решения, попросту ограничивая входные данные. Попробуйте решить задачу правильно, как если бы на вход могли поступать и бо́льшие значения.

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

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

Турниры

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

Если нет возможности/желания участвовать во всех турнирах, старайтесь принимать участие на неделях с двойными турнирами. Это даст достаточный турнирный прогресс и монеты, при участии всего раз в две недели.

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

Прочее

На странице любой задачи нажмите в подсказку возле выбранного вами ЯП, ознакомьтесь, какие возможности доступны, помимо "из коробки".

Посмотрите аддоны по запросу "leetcode" для вашего браузера. Таймеры, скрытие [вопросов], счётчики сложности для листов, локальные заметки к задачам, дополнительные видео-решения, форматтеры, etc.

Иногда заглядывайте во вкладку обсуждений официального профиля LeetCode. Там публикуются обновления, новые планы и карточки учебника. Они некоторое время отображаются на главной странице, но в профиле следить за единым списком удобнее.

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

Не участвуйте с телефона, особенно в турнирах. Очевидные неудобства озвучивать не буду, но отмечу, что можно поймать TLE на тех решениях, что отлично проходят на ПК.

При вольном выборе задач не пренебрегайте лёгким уровнем сложности. Нередко вижу подобных пользователей, но не понимаю подход. Если вы планируете долгосрочное участие, вы так или иначе столкнётесь с этими задачами. Так зачем в начале с раздражением ломать голову над сложным уровнем, чтобы потом зевая решать лёгкий? Двигайтесь по плану, это и проще, и продуктивнее.

Позовите с собой друга, это хороший способ держать настрой – обсуждение ежедневных задач и тем, небольшое дружеское соревнование, чувство локтя, если где-то запнётесь. Если ваш уровень выше, получите небольшой опыт наставничества, и сами, как это и случается, лучше разберётесь в разъясняемой теме.


За сим всё. Статья описательная, но это описание должно хоть где-то быть.

Как обычно – дополнения, уточнения, раскрытие тем приветствуются.

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

Увидимся в следующем году!

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


  1. Arastas
    30.12.2022 11:45

    Интересно, спасибо. Чтобы понимать, предложенные три задачи в день это сколько в часах, условно?

    А какие есть войтивайти аналоги leetcode?


    1. TLHE Автор
      30.12.2022 12:34

      Среднее даже условно не назову, слишком много факторов. Скажем так: минимально – до 10 минут на все, если задачи совсем не вызывают сложности, но и не однострочники; максимально, соглашусь с позицией сайта, – по 30 минут на задачу + время на разобраться с решением, если самостоятельно так и не вышло, при учёте, что готовое решение понятно. Если нет, тогда стоит отложить такую задачу на потом.
      Ну а там уже стоит отталкиваться от собственного среднего – увеличивать количество или сложность хотя бы до получаса, если каждый день за 10 минут решается; снижать сложность и читать дополнительные источники по теме, если каждый день на максимуме.

      Про аналоги лучше перенаправлю.
      А в целом, айти-то большой, на одном ресурсе всего, даже пусть только вводного уровня, никогда не найдёте. Тут только про АиСД, и то далеко не весь. По каждой теме ищите специальный ресурс, а лучше несколько.


      1. Arastas
        30.12.2022 13:24
        +1

        О, спасибо, я из них только проект Эйлер знал.
        Иногда, хочется отвлечься от основной работы, порешать какие-то задачки, переключить мозг. Я обычно иду на math.stackexchange или решаю головоломки. Но почему бы не порешать какие-то программерские штуки… ;)


  1. Alexandroppolus
    30.12.2022 12:06
    -1

    А за сколько "проходятся" все задания литкода?

    Можно не упарываться в легкие и средние задачи. Немного попрактиковаться, подтянуть алгоритмы, и более плотно уже заняться хардами - там всё самое жареное.


    1. TLHE Автор
      30.12.2022 12:44
      +1

      Упоминал этот подход, и что я с ним не согласен. Можно-то, конечно, но это для уже хорошо разбирающихся в теме, и которым не нужны все эти планы, учебники, соревнования. Зайти на пару дней, решить десяток хардов и закрыть на год. Но таким пользователям этот материал тогда и не нужен. А для всех остальных этот подход только во вред – либо бросят в раздражении от задач не по силам, либо начнут бездумно копипастить готовые решения. Поэтому я за подход – структурно, последовательно, стабильно, тогда будет и толк.


    1. unt1tled
      01.01.2023 14:46

      По моим наблюдениям, в хардах упор не на знание алгоритмов, а на пердолинг и запутывание мозгов. Именно подтянуть алгоритмы это изи и мидл.


      1. TLHE Автор
        01.01.2023 14:50

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


        1. unt1tled
          01.01.2023 15:07
          +1

          Мой опыт:

          Изи - одна задача, один массив; тут именно знание и применение структуры данных и алгоритма над ней в пробирке.

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

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


      1. Arastas
        01.01.2023 17:00
        +1

        Пердолинг? Не расшифровал.


        1. unt1tled
          01.01.2023 22:54
          +1

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


  1. Tim7456
    30.12.2022 12:44
    +1

    Leetcode отличный ресурс для подготовке к coding interview в FAANG. Покупаете подписку на месяц. Открываете соответствующий список задач и решаете все подряд. Вы должны решать любые задачи уровня medium за 20-30 минут. Именно столько у вас и будет на интервью.
    Как все задачи курса прорешали - так к coding interview готовы. На 5-6 уровень этого достаточно. А на system architecture уже по другому готовиться надо.


  1. ivanovdev
    30.12.2022 20:04

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


    1. TLHE Автор
      30.12.2022 20:45
      +1

      Новый год уже начался?)

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

      Цель в том, чтобы лучше овладеть темой, и она и достигается "тратой" времени. Как и всё остальное.

      А подписка – просто дополнение к движению, можно и без неё, как будет угодно.


  1. stanislav888
    31.12.2022 08:20
    +1

    Leetcode великолепен!
    Пробовал некоторые известные учебники по алгоритмам, не зашло. На этом сайте всё объясняется отлично.
    Плюс, ещё куча толковых мнений, советов, подсказок от других людей, по каждой теме.
    Минус только один - нет поддержки С++20 и новее.
    Премиум подписка своих денег стоит, однозначно.