Эволюция программиста
Эволюция программиста

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

А для тех, кто все‑таки не знает, LeetCode — платформа для решения алгоритмических задач разной сложности и тематики, соревнований по скорости и производительности и просто общению с коммьюнити единомышл��нников по этой теме.

Эта статья - впечатления о моём 600-дневном марафоне на этой платформе, динамике моих скилов и ответе на главный вопрос “надо ли решать там задачи?”.

Как правило, по отношению к LeetCode люди делятся на два лагеря:

  • ценители и любители LeetCode и алгоритмов;

  • ненавистники LeetCode, которые считают его бесполезной тратой времени.

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

На этом мое знакомство с Leetcode закончилось и на некоторое время отстранился.

Все было спокойно, пока мы с другом не заключили спор  - сможем ли мы решить 100 задач до конца 2023 года? А это было 50 задач всего за 1 месяц - декабрь.

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

Челлендж в 100 задач оказался достаточно легким - Новый год мы встречали уже с круглым числом выполненных задач в профиле. Так быстро мы решили не останавливаться - Покоренная вершина стимулировала покорить новую - 200 задач к началу лета (за 5 месяцев).

В конце челленджа в 200 задач мой друг принял решение сойти с дистанции - переизбыток алгоритмов в крови, голове и остальных частях тела вызывал у него дискомфорт и галлюцинации, поэтому в его профиле красуется круглое «200», а я же к этому времени только “разогрелся” и вошел во вкус.

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

Сбивать стрик было как-то жалко - это же целых 10 дней. Так и началась долгая история в 600 дней...


Впечатление

В итоге стрик продлился на 600+ дней и 700+ задач и продолжается на текущий момент: явный интерес был первые 100-200 дней, а далее началась рутина и тяжелая дисциплинированная работа - важно было установить личный рекорд.

Текущая статистика
Текущая статистика

Мой алгоритм в решении был весьма тривиален:

  • Если дейли решаемый - решаю дейли.

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

  • Как правило, под руку попадались Easy/Medium задачи -  этого хватало, чтобы размять свою голову с утра / перед сном.

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

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

Тяжелая дорога наверх
Тяжелая дорога наверх

А надо ли оно

Главный вопрос:

А надо ли оно? Для точного ответа на этот вопрос важно ответить на уточняющие:

  • Вы работаете с высоконагруженной системой?

  • Хотите ли вы попасть в бигтех?

  • Вас привлекают алгоритмы и приносят вам радость?

Если хотя бы на один вопрос вы ответили «да», то LeetCode - подходящий способ прокачать ваши алгоритмические скилы. Хотя бы на 100 задачек. 

Какую пользу можно извлечь из такой авантюры?

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

  2. Изучение языка - возможно, лучше способа для этого и не придумать. Человек - ленивое существо, и вам наверняка не захочется в очередной раз писать шаблонный код для тривиальной задачи, а воспользоваться готовой функцией. Для этого придется подробно ознакомится с std функциями вашего языка. Спустя какое-то время вы сможете писать их даже в блокноте без подсказок ide, что иногда требуют на некоторых собеседованиях.

    Junior код:

    fun countChars(s: String): Map<Char, Int> {
        val res = mutableMapOf<Char, Int>()
        for (c in s) {
            if (res.contains(c)) res[c] = res[c]!! + 1
            else res[c] = 1
        }
        return res
    }

    Senior код:

    fun countChars(s: String): Map<Char, Int> =
        s.groupingBy { it }.eachCount()
  3. Паттерны - любой базовый алгоритм превратится для вас в набор шаблонных действий разной очередности. Со временем  понимать чужие решения станет в разы проще.

  4. Структуры данных - если это ваша слабая сторона, то LeetCode поможет исправить это: массивы, списки, хэш таблицы, деревья, графы и даже стэк с очередью будут ждать вас в решениях самых разных задач. 

По началу придется смотреть чужие решение — по ним можно понять оптимальные пути решения проблем и увидеть шаблоны.

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

LeetCode — это просто один из удобных и порой интересных инструментов, где можно это освоить и «посоревноваться» с другими.


Почему не hard

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

Плохо ли это? Опять же все зависит от ваших целей и возможностей.

Если ваша цель - подготовиться к собеседованию в Google или другие подобные компании, то это будет маст хев. Но для базового понимания алгоритмов и игры "в долгую" это явно будет лишним - заканчивая 8-часовой рабочий день, вы вряд ли захотите потратить еще пару часов на решение головоломки уровня hard для достижения эфемерной цели "узнать алгоритмы" Здесь больше подходит правило привычки, а не быстросгорающей мотивации, на которой далеко не уедешь.

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


Решения

Из всех решений, что я видел за это время на LeetCode, я выделил следующие группы:

  1. Максимально производительные и правильные решения.

    Они основаны на паттернах или даже математике и дают "100% beats" в ваше решение: std функции языка не используются, а «изобретается велосипед», но весьма производительный. 

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

  2. Элегантные и непроизводительные решения.

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

    Такой код не претендует на эффективность, но демонстрирует красоту языка и уровень его познания у написавшего.

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

  3. «Чтобы просто работало».

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

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

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

Производительный вариант (~1ms):

fun canPlaceFlowers(flowerbed: IntArray, n: Int): Boolean {
    if (n == 0) return true

    var remaining = n
    var i = 0

    while (i < flowerbed.size) {
        if (flowerbed[i] == 0) {
            val prev = if (i == 0) 0 else flowerbed[i - 1]
            val next = if (i == flowerbed.size - 1) 0 else flowerbed[i + 1]

            if (prev == 0 && next == 0) {
                flowerbed[i] = 0
                remaining--
                if (remaining == 0) return true
                i++
            }
        }
        i++
    }
    return remaining == 0
}

Лаконичный вариант (~30ms):

fun canPlaceFlowers(flowerbed: IntArray, n: Int): Boolean = flowerbed
    .withIndex()
    .filter { it.value == 1 }
    .map { it.index }
    .let { listOf(-2) + it + (flowerbed.count()+1) }
    .zipWithNext { i, j -> (j - i - 2) / 2 }
    .sum() >= n

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

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

  1. Первое решение заметно выигрывает в скорости.

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

  3. Их алгоритмическая сложность одинакова и равна O(N) из-за полного обхода.

  4. Первое решение заметно выигрывает по потребляемой памяти (O(1) vs O(n)), из-за отсутствия преобразований структур и работы с исходным массивом.

Дилемма LeetCode'ра
Дилемма LeetCode'ра

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

  1. prefix sum

  2. sliding window

  3. hash table

  4. dfs

  5. binary search

  6. two pointer

  7. stack & queue

Останавливаться на них мы не будем, но если вы разберетесь в них, то большая часть задач LeetCode будет вам под силу.

С базовыми интерпретациями можно ознакомиться в прекрасной и легкой книжке - «Грокаем алгоритмы».


Систематичность

В чем же секрет? Да, на самом деле, ни в чем.

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

Это может занять 2 минуты или 2 часа, но задача будет решена и квадратик заполнится зеленым цветом

Единственный минус при таком раскладе -  достаточно часто это просто задача ради задачи: она не учит чему-то новому и уже не развивает какие-то скилы в алгоритмах или языке.

Как я и писал выше, где-то на 200+ день это просто превратилось в рутинную работу, которую я в том или ином виде делаю каждый день.

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

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

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


Собеседования

Цель решения этих задачек может быть разной:

  • изучение функций языка;

  • изучение алгоритмов;

  • небольшая разминка для мозга;

  • просто банальная состязательность в решениях между собой;

  • тренировка к прохождению собеседований в бигтех компании по типу Google, Yandex и подобных.

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

Поможет ли вам в этом LeetCode? Скорее да, чем нет. Все зависит от подхода к решению задач.

Основная цель - понять какой-то паттерн решения и получить навык применять его в решении аналогичной задачи

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

Иногда даже сами HR высылают список задач на тренировку к алгоритмической секции собеседования (Yandex).

Исходя из опыта коллег, для порога прохождения собеседований необходимо решить хотя бы 100 задач easy/medium сложности. При этом это не дает никаких гарантий и некоторым может понадобится в разы больше.

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

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

Приступ синдрома самозванца
Приступ синдрома самозванца

П.с. картинка взята из чужой статьи про литкод

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


Советы

И наконец от себя хотел бы дать ряд советов:

  1. Определитесь с целью.

    Правильная цель задаст нужный ритм вашей работе!
    Возможно, оно вам просто не нужно.

  2. Начните с простого.

    Мало кто сможет сходу решить большинство medium и hard задач.
    Обращайте внимание на Acceptance Rate в задачах: чем выше процент, тем больше вероятность решить ее.

  3. Не стесняйтесь смотреть чужие решения.

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

  4. Экспериментируйте.

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

  5. Привычки сильнее мотивации.

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

  6. Делитесь своими решениями.

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


Итоги

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

LeetCode - это отдельный мир, в котором свои правила игры и не так много соприкосновений с реальностью.

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

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


  1. Warperus
    29.10.2025 09:21

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

    Алгоритмическая сложность "производительного" алгоритма O(N), потому что сортировка 26 значений в O-нотации это всё ещё O(1).

    Потребление памяти обоими алгоритмами O(N), хотя константа у левого и меньше. Наивно полагать, что на больших N слово влезет в память константного размера.

    Попробуйте прогнать эти решения со строкой в миллионы символов.


    1. qveex Автор
      29.10.2025 09:21

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

      По сложности тоже согласен. Не самый удачный пример выбрал все-таки. Постараюсь поправить этот момент


    1. domix32
      29.10.2025 09:21

      Потребление памяти обоими алгоритмами O(N),

      O() потребление памяти подразумевает сколько дополнителной памяти будет выделено в худшем случае при выполнении алгоритма, то есть исключая память на входные данные. Если это несколько переменных и исходный входные данные меняются на месте или происходит выделение памяти некоторого фиксированного размера, не имеющего зависимости от размера входных данных, то это всё ещё константа. У производительного примера именно так и происходит, а у лаконичного происходит кучка почти N константных небольших аллокации (listOf(-2)) в лямбде, которая почти сразу же освобождаются. И вероятно есть скрытые аллокации в zipWithNext, из-за чего и страдает производительность, но эти аллокации делают как раз C*N дополнительных аллокаций, что приводит к амортизированному O(N) по памяти для второго алгоритму и O(1) для производительного.

      Когда решал задачи на Rust, старался сделать так, чтобы код был лаконичным и производительным. 99.9% задач решались как раз вот такими вот map/filter цепочками с ленивым вычислением. Отслеживание лишних аллокаций - как раз путь к производительному коду. Есть алгоритмы, которые нельзя записать лаконично и производительно, но большинство алгоритмов вполне. По крайней мере в рамках задач на литкоде, где обработка ошибок/исключений обычно не требуется.


      1. qveex Автор
        29.10.2025 09:21

        Там был комментарий к предыдущему примеру

        По памяти абсолютно правы, это главная проблема коробочных функций, как по мне

        Код получается "чистым", но производительность и память явно страдают

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


    1. Samhuawei
      29.10.2025 09:21

      Я бы ещё добавил что первое решение игнорирует полезные практики, например, continue если ветка условия не нужна в цикле. Когда отступов много фокус теряется и легко допустить ошибку. Ну и I там не нужно. Понятно что компилятор оптимизирует обращение к массиву по индексу, но там вполне можно обойтись двумя указателями.


  1. stas_dubich
    29.10.2025 09:21

    Выглядит как литкод ради литкода)

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

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

    Человеческий мозг это как уникальный процессор, который способен творить, но почему то из него пытаются сделать hdd, заучить функции языка, заучить алгоритмы которые с вероятностью 99% никогда не пригодятся и тд


    1. qveex Автор
      29.10.2025 09:21

      Выглядит как литкод ради литкода)

      Именно так это и ощущалось!)

      На самом деле, примеров не так уж и много

      Для себя отметил такие вещи:

      • Стал обращать внимание на последовательность вызовов - если можно изменить их очередность и кол-во обрабатываемых данных сократиться.

      • Аналогично с алг. сложностью - чаще использовать set, map и иногда деревья (их редко). Т.е. мозг начал обращать внимание на вещи, которые большинство пропустит мимо.

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

      Как и писал в статье, очень это специфический инструмент обучения, но мне почему-то зашло (не во всех аспектах)


    1. ImABug
      29.10.2025 09:21

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

      Я спустя 700 задач могу сказать, что по сравнению с 1,5-2 годами назад натыкаясь иногда на свои старые решения смотрю на них с улыбкой и понимаю сколько же в них лишнего, буквально натягивание совы на глобус по сравнению с тем как решаю сейчас. Стал использовать более подходящие структуры данных, стал почти моментально видеть хотя бы верхнюю границу big О того или иного кода, не говоря о том, что узнал кучу алгоритмов, которые на порядок бустят мои старые решения. Да и банально, это учит тебя постепенно смотреть на задачу под разным углом. На литкоде не мало задач, которые разумно решаются фактически только одним способом, но есть и те, где можно раскрутить и реализовать по-разному и все варианты хороши.

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


  1. itatarchenkoru
    29.10.2025 09:21

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

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


  1. Viacheslav01
    29.10.2025 09:21

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

    А потом такое, для запуска нашего notepad вам необходимо 100500 гб винта, 100500 гб мозгов и камень в 32 ядра о 5 ггц.


    1. qveex Автор
      29.10.2025 09:21

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

      Даже использование базовых функций map, sumOf, reduce и т.п. накладывает какой-то отпечаток на производительность. Несмотря на то, что алгоритм идентичен, "модное" решение практически всегда будет заметно проигрывать в скорости и памяти.

      Аналогично и со стримами java, насколько я знаю

      По-хорошему надо покопаться в кишках реализации и выяснить в чем все-таки дело, но это уже совсем другая история)


      1. alexandr93
        29.10.2025 09:21

        О да, тоже решаю литкодж и пытаюсь как-то эксперементировать. Решение просто манипулировать массивом в джаве это 6 мс, но вместо массива взять стримы иииии 26 мс. В 4 раза дольше. Но самый прикол. Решение на джаве - 5 мс: https://leetcode.com/problems/maximum-number-of-distinct-elements-after-operations/submissions/1805361112/ Решение абсолютно такое же, но с векторами на С++ - 95 мс: https://leetcode.com/problems/maximum-number-of-distinct-elements-after-operations/submissions/1805360930/


        1. qveex Автор
          29.10.2025 09:21

          Тоже замечал такое

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


        1. Jijiki
          29.10.2025 09:21

          может с деревом будет по-лучше


        1. HiItsYuri
          29.10.2025 09:21

          Вы отключаете синхронизацию ввода/вывода для C++ в своем решении?


          1. alexandr93
            29.10.2025 09:21

            Вот не знаю чего не открывается. Я только сам код решения адаптировал. Там по сути 2 решения. Одно за O(max val) и с соответствующим расходом памяти для диапазонов до 500 000. Другое - с сортировкой за O(N log N). Я думал, что в решении ща O(max val) самое сложное это выделение такого объёма памяти, но C++ по идее с этим должен был справиться не хуже джавы. Я так подозреваю, что дело таки в использовании вектора, но для C++ литкод всегда и предлагает использовать векторы.

            Java
            class Solution {
                public int maxDistinctElements(int[] nums, int k) {
                    if (nums.length <= (k << 1) + 1) {
                        return nums.length;
                    }
            
                    int result = 0;
                    int minVal = Integer.MIN_VALUE;
                    int max = 0;
            
                    for (int num : nums) {
                        max = Math.max(max, num);
                    }
            
                    if (max < 500_000) {
                        return digSortSolution(nums, k, max);
                    }
            
                    return sortingSolution(nums, k);
                }
            
                private int digSortSolution(int[] nums, int k, int max) {
                    int minVal = Integer.MIN_VALUE;
                    int[] freqs = new int[max + 1];
                    int result = 0;
            
                    for (int num : nums) {
                        freqs[num] ++;
                    }
            
                    for (int i = 0; i < freqs.length; i ++) {
                        int count = freqs[i];
            
                        if (count > 0) {
                            int currentMinVal = Math.max(minVal, i - k);
            
                            for (int j = 0; j < count && currentMinVal <= i + k; j ++, currentMinVal ++) {
                                result ++;
                                minVal = currentMinVal + 1;
                            }
                        }
                    }
            
                    return result;
                }
            
                private int sortingSolution(int[] nums, int k) {
                    int result = 0;
                    int minVal = Integer.MIN_VALUE;
            
                    Arrays.sort(nums);
            
                    for (int num : nums) {
                        int currentMinVal = Math.max(minVal, num - k);
            
                        if (currentMinVal <= num + k) {
                            result ++;
                            minVal = currentMinVal + 1;
                        }
                    }
            
                    return result;
                }
            }
            C++
            class Solution {
            public:
                int maxDistinctElements(vector<int>& nums, int k) {
                    if (nums.size() <= static_cast<size_t>((k << 1) + 1)) {
                        return nums.size();
                    }
            
                    int max_val = 0;
                    for (int num : nums) {
                        max_val = max(max_val, num);
                    }
            
                    if (max_val < 500000) {
                        return digSortSolution(nums, k, max_val);
                    }
            
                    return sortingSolution(nums, k);
                }
            
            private:
                int digSortSolution(vector<int>& nums, int k, int max_val) {
                    vector<int> freqs(max_val + 1, 0);
                    int minVal = INT_MIN;
                    int result = 0;
            
                    for (int num : nums) {
                        freqs[num]++;
                    }
            
                    for (int i = 0; i < static_cast<int>(freqs.size()); i++) {
                        int count = freqs[i];
            
                        if (count > 0) {
                            int currentMinVal = max(minVal, i - k);
            
                            for (int j = 0; j < count && currentMinVal <= i + k; j++, currentMinVal++) {
                                result++;
                                minVal = currentMinVal + 1;
                            }
                        }
                    }
            
                    return result;
                }
            
                int sortingSolution(vector<int>& nums, int k) {
                    int minVal = INT_MIN;
                    int result = 0;
            
                    sort(nums.begin(), nums.end());
            
                    for (int num : nums) {
                        int currentMinVal = max(minVal, num - k);
            
                        if (currentMinVal <= num + k) {
                            result++;
                            minVal = currentMinVal + 1;
                        }
                    }
            
                    return result;
                }
            };
            


            1. HiItsYuri
              29.10.2025 09:21

              Я не был залогинен, потому и не открывалось.

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

              https://stackoverflow.com/questions/48367983/why-does-sync-with-stdiofalse-speed-up-the-code

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


        1. warkid
          29.10.2025 09:21

          Решение абсолютно такое-же. Но, полагаю, значимое отличие это сортировка. Которая под капотом реализована силно по-разному в Java и С++. Алгоритмы разные и возможно тестовые данные для джавовского удобнее.


        1. malkovsky
          29.10.2025 09:21

          А литкод убрал убрал дисперсию в замерах? Если нет, то на время работы особого смысла нет смотреть. Раньше точно было такое, что посылка одного и того же решения могла дать "beats 100%", а могла и "beats 30%"


          1. urvanov
            29.10.2025 09:21

            Когда я летом там игрался, то такая проблема ещё была.


        1. domix32
          29.10.2025 09:21

          Там для разных языков есть заметный разброс на накладные расходы - на время исполнения, на потребление памяти. Непонятно с чем связана, но два идентичных сабмишна на Rust будут выполняться с практически милисекундной точностью и относительно стабильно съедать примерно 2мб+сколько сами навыделяете сверху. В С++ сабмит даёт разброс по времени едва ли не в полсекунды иногда и разброс по памяти 5-10мб + выделенная вами память, хотя если запускать тот же код локально с некоторой минимальной обвязкаой, то память едва-едва будет больше килобайта помимо того, что выделил непосредственно ваш алгоритм. Отдельно встречал приколы, когда отправлял очень старые решения повторно и те показывали втрое худшие цифры как по скорости, так и по памяти. Видимо там есть какие-то накладные расходы на песочницы, поэтому замеры скорости у программ на leetcode полезны только ранжирования решений на leetcode. Аналогичные истории с другими языками.

          А вообще подозрительно, что код на С++ при прочих равных сожрал на 30 метров памяти больше.


    1. Artem_Omny
      29.10.2025 09:21

      И notepad этот обязательно от самых пресамых, у кого уже hard задачи на собеседованиях


    1. green_fenix
      29.10.2025 09:21

      Ну а как, в блокноте же теперь копайлот есть. Жизненно необходимая фича.


      1. Warperus
        29.10.2025 09:21

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


  1. AlexeyK77
    29.10.2025 09:21

    fun minimumPushes(word: String) = word
        .groupingBy { it }
        .eachCount()
        .values
        .sortedDescending()
        .chunked(8)
        .foldIndexed(0) { i, acc, counts -> acc + counts.sum() * (i + 1) }

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

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


    1. domix32
      29.10.2025 09:21

      как его дебажить

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


    1. Artem_Omny
      29.10.2025 09:21

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


      1. AlexeyK77
        29.10.2025 09:21

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


        1. Warperus
          29.10.2025 09:21

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

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

          И будет несильно медленней.


    1. MechanicZelenyy
      29.10.2025 09:21

      как его дебажить

      Извините за пассивно агрессивный тон, но дебажить это надо деббагером.

      Мне лень прикреплять картинку, но IDE спокойно ставит брики внутри лямбд и спокойно проваливается внутрь функций

      ускорять

      1) По ситуации. Заменять библиотечные функции, своими если вас не устраивает их скорость, использовать sequence там где просто mapReduce обработка, добавить подсказки компилятору


      1. tenzink
        29.10.2025 09:21

        Да и дебажить именно этот метод нет вообще никакой необходимости. Он "чистый", идеально покрывается тестами и очень понятен.


        1. Kanut
          29.10.2025 09:21

          Ну ошибиться там тоже можно. И если результат не совпадает с ожиданиями, то дебажить вполне себе вариант.

          Другое дело что не особо понимаю в чём должна быть проблема. Любая более-менее адекватная IDE имеет что-нибудь вроде "watches" или "live console". Поставил брейкпоинт в начале выражения и можно "вручную" выполнить любой из этапов с просмотром результата...


          1. atd
            29.10.2025 09:21

            А как "highload" связан с языком программирования, простите?


            1. AndreyDmitriev
              29.10.2025 09:21

              Тут видимо имеется ввиду. что С# - это управляемый код, так что у нас есть дополнительная прослойка в виде IL/JIT, соответственно получить производительность, сравнимую с тем же Си или Растом бывает чуть сложнее. Писать высокопроизводительный код на нативном Питоне (ну то есть без библиотек) - примерно тоже самое, только ещё хуже. Вообще если упираться в максимально эффективный машинный код, то тут ещё и компилятор влияет, ингода перекомпиляция Си кода интеловским компилятором может дать хороший буст. Ну и при анализе узких мест желательно заглядывать именно в машинный код, на уровне ассемблера, и С# тут не сильно помогает. Бывает проще расчехлить Си, аккуратно выписать и отпрофилировать самую нагруженную часть там, а затем уже подключать к С# или Питону в виде библиотеки.


              1. atd
                29.10.2025 09:21

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


                1. AndreyDmitriev
                  29.10.2025 09:21

                  Может я тогда сакральный смысл "highload" не очень понимаю. Просто захожу вот сюда - highload.fun/tasks, вижу список заданий. Соревнование идёт именно за время выполнения кода, там везде "...for the shortest time". Практически везде С++ с хорошим отрывом от С#, и мне понятно почему. В первом же примере С++ 2,911, а С# 14,506 - это пятикратная разница. Вот медиана ещё показательнее - тут вообще в 60 раз, медиану на чистом шарпе оптимально найти непросто. Кстати, Раст почти вровень с С++, это то что я и на практике наблюдаю. Я это к тому, что можно соревноваться в классе С++ или С#, но сравнивать их нельзя. Это примерно как есть Формула 1, а есть ралли "Дакар" - просто разные вещи, разные "весовые категории", что ли. Но писать оптимальный код именно на используемом языке надо уметь, конечно, и такие упражнения помогают, да.


    1. MountainGoat
      29.10.2025 09:21

      Этот язык я не знаю, но в Rust IDE после каждой строчки напишет, что именно за типы получаются на выходе. А в Python можно бряк с условием поставить, типа "останови на восьмой итерации или когда х % 2 == 0"

      Так что применяйте современные инструментарии и всё будет.


    1. iamkisly
      29.10.2025 09:21

      Я вот ни бельмеса в Kotlin, но это буквально почти как dotnet linq, и читается не хуже


    1. IgorPie
      29.10.2025 09:21

      в idea , например, есть отладка стримов, вероятно, тут тоже она есть


      1. Zara6502
        29.10.2025 09:21

        спросите у автора, там недавно zig добавили по просьбе трудящихся. я пишу в основном на C#, мне нра.


      1. atd
        29.10.2025 09:21

        То есть Go, Rust и Zig вас не смутили?


  1. Zara6502
    29.10.2025 09:21

    тут же на хабре узнал о проекте highload.fun (можете считать за рекламу). а вот leetcode мне сильно не понравился, неудобен, постоянная борьба с интерфейсом.


  1. anonymous
    29.10.2025 09:21


  1. anonymous
    29.10.2025 09:21


  1. WASD1
    29.10.2025 09:21

    Ну это же просто наблюдение Гудхарта (все "законы" Мёрфи - это наблюдения за функционированием бюрократических \ социальных систем в реальности) в действии.

    Раньше "умение решать алгоритмы" хорошо коррелировало с сообразительностью и способностью разобраться в других сферах.
    Сейчас "умение решать алгоритмы" (ну за исключением hard - но там уже даже при наличии олимпиадного бэкграунда не 2 вечера вспоминать) - коррелирует с потраченным на leetcode временем.


  1. SWATOPLUS
    29.10.2025 09:21

    Как правило, по отношению к LeetCode люди делятся на два лагеря:

    • ценители и любители LeetCode и алгоритмов;

    • ненавистники LeetCode, которые считают его бесполезной тратой времени.

    Приглашаю в свой третий лагерь:


    1. UFO_01
      29.10.2025 09:21

      Зашёл на codeforces, и как будто попал в школьные времена, когда к ЕГЭ и олимпиадам готовился, странно что я тогда про него не слышал. Возьму на заметку, спасибо. Жаль что для eolymp айпишником не вышел :(


    1. Femistoklov
      29.10.2025 09:21

  1. RikkiMongoose
    29.10.2025 09:21

    В заголовке написано "что из этого вышло".

    В тексте нет ни слова о том, что же из этого вышло.

    Как решал задачи, так и решает.

    День за днем. Месяц за месяцем.

    "потратил колоссальное количество усилий и времени."

    У вас жизнь бесконечная, усилия ничего не стоят. Решайте Литкод.


    1. Keeper22
      29.10.2025 09:21

      Лучшая иллюстрация (бес)полезности Литкода.


      1. SWATOPLUS
        29.10.2025 09:21

        Бесполезность, потому что нужно не просто решать задачи каждый день, но и постепенно наращивать сложность. А так польза лишь в отсрочке деменции.


  1. vadimr
    29.10.2025 09:21

    Само по себе решение задач по фану - вполне достойное времяпрепровождение, но вряд ли большое количество решений уровня Easy поднимет ваш уровень программирования. В любом деле для прогресса обучения надо повышать сложность. Программирование тут не является исключением, реальные задачи обычно требуют продолжительной работы. Они могут быть и не сложными алгоритмически, но требующими многодневной концентрации внимания.

    А как хобби - почему бы и нет.


  1. Sequoza
    29.10.2025 09:21

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


    1. alexandr93
      29.10.2025 09:21

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


    1. qveex Автор
      29.10.2025 09:21

      Больше зависит от человека, который решает

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

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


    1. tommyangelo27
      29.10.2025 09:21

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


      1. qveex Автор
        29.10.2025 09:21

        Вполне логичный подход

        Так и надо делать кмк

        Многим просто хочется в моменте утвердить свои скиллы, поэтому останавливаются чисто на практике, хотя это малоэффективный подход


    1. domix32
      29.10.2025 09:21

      Большинство задач просто брутфорсом пробовал, потом оптимизировал по необходимости алгоритм, какие-то задачи разбирают на ютубе. Например, neetcode имеет много разборов дейликов на питоне. Какие-то задачи поясняют в обсуждениях но там как повезёт - иногда есть годные разборы, иногда фигня типа "ставь лайк, подписка, вот тебе скриншот решения вензельным шрифтом". Для большинства задач имеется достаточно явная чуйка о необходимых подходах, что позволяет брутфорсить оптимальные решения сходу.


  1. 0x131315
    29.10.2025 09:21

    Человеку для хорошего настроения нужны регулярные победы. Пусть они будут маленькими, но победы. Обычно их и так хватает в жизни и работе, но иногда может быть недостаток. Решение легких задачек может быть неплохим источников таких маленьких доступных и регулярных побед.


  1. wmlab
    29.10.2025 09:21

    Я учился по книжке "Задачи по программированию". За давностью лет не помню автора. 80-е годы, перевод. Задачи были типа "Вот упрощенный вариант Монополии (для N игроков) - правила. Напишите код. Слишком легко? Предложите и напишите оптимальную стратегию игры со стороны компьютера". А на первом курсе нам показали пошаговую игру "Посадка на Луну" (на текстовом терминале) - предложили свой вариант написать. Мне это показалось легким и я стал решать задачу оптимальной посадки в общем виде. Быстро пришел к выводу необходимости тренировок и расставлением полученной телеметрии в многомерном пространстве высота-скорость-масса-топливо-тяга. С интерполяцией между исследованными точками. А вот до обученной нейросетки не додумался, это да :)


  1. bak
    29.10.2025 09:21

    Решать 600 легких задач никакого смысла нет. Чтобы рос навык - надо постепенно усложнять уровень задач. Это все равно что ходить в качалку и каждый день жать один и тот же вес одинаковое число повторов.


    1. qveex Автор
      29.10.2025 09:21

      Абсолютно согласен

      Последнее время стараюсь больше внимания уделять medium задачам

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

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

      На Easy и Medium чувствую себя +- комфортно, но на Hard уже нужно реально тратить время, а не под чаек посидеть


    1. Sau
      29.10.2025 09:21

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


      1. bak
        29.10.2025 09:21

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


        1. Sau
          29.10.2025 09:21

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


    1. tommyangelo27
      29.10.2025 09:21

      Это все равно что ходить в качалку и каждый день жать один и тот же вес одинаковое число повторов

      А что плохого? Если устраивает объем мышц и сила


    1. dovg
      29.10.2025 09:21

      >Это все равно что ходить в качалку и каждый день жать один и тот же вес одинаковое число повторов.

      так это норм же, не? Я несколько лет уже делаю "одинаковое число повторов с одинаковыми весами" и бегаю "одинаковые дистанции в одинаковом темпе с одинаковым пульсом"

      Это же гигиена, чищу зубы я тоже одинаково.

      Если у тебя цель "чтобы навык не падал" (aka "бегаю, чтобы не жиреть"), то подход автора вполне ок, разве нет?


  1. Kovurr
    29.10.2025 09:21

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


    1. bak
      29.10.2025 09:21

      То что в полицию не берут людей не сдающих нормативы - это ок, а то что разработчиков не знающих алгоритмы - не ок?

      Представляю нытьё полицейских:
      - "В реальной работе я не занимаюсь отжиманиями и подтягиваниями!"
      - "Я и с пузом нормально арестовываю!"
      - "Мы давно на машинах за преступниками бегаем - кому этот бег нужен!"
      - "А мы просто за жизнь спрашиваем - если человек может рассказать кого как арестовывал над какими делами работал - берем!"


      1. domix32
        29.10.2025 09:21

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


      1. i86com
        29.10.2025 09:21

        Нормативы физподготовки может без труда сдать примерно каждый второй здоровый человек. Конкретную сложную алгоритмическую задачу с литкода - едва ли один на 10к - если вот недавно именно её читал и ещё не успел забыть за ненадобностью.


        1. bak
          29.10.2025 09:21

          Если бы на работу в полицию стояла такая же очередь как и на работу в условный google - нормативы были бы куда выше. Тут скорее по требованиям надо сравнивать с отрядом элитного спецназа. (хотя сейчас и там скорее недобор желающих нежели какой-то конкурс)
          PS. Когда ты обычный разраб и решил пройти собес в гугл


  1. jakobz
    29.10.2025 09:21

    Как-то на каком-то похожем сайте решал задачки давно.

    И там была задачка - дано сколько-то «рук» в покере - надо посчитать когда левая бьет правую комбинацию.

    И мне она так понравилась, что я её давал как тестовую потом.

    Прикол в том, что это не сложная какая-то муть про o(n), это максимально близко к тому, что приходится писать в бизнес-приложениях: куча странных условий друг на друге. И написать это красиво и понятно - надо прям уметь.

    Такие задачки на leetcode попадаются?


    1. navferty
      29.10.2025 09:21

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


      1. jakobz
        29.10.2025 09:21

        1. domix32
          29.10.2025 09:21

          На hard и medium иногда встречаются задачи подобной сложности. Иногда читаешь задачу - звучит просто. А потом добавляется какой-нибудь дополнительный финт к базовой струтуре и начинается веселье.


        1. talebin
          29.10.2025 09:21

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

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

          Поэтому со временем я ввел некоторые правила, которые помогают искать подходящие задачи. Одно из них звучит так:

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

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

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

          PS: Кстати, если на какую-то позицию допустимо проводить собеседование без задач - лучше так и сделать. Вряд ли кто-то из нас заканчивал "пед". Мы с трудом понимаем, как именно это нужно делать, чтобы не навредить ни себе, ни испытуемому.


          1. jakobz
            29.10.2025 09:21

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

            Для онлайн "при зрителях" - она прям слишком сложная. У меня для собесов задачи прям супер-простые, в т.ч. чтобы не парализовало. Уровня дописать полу-готовый ToDo List на React, или вынуть суммы из трех связанных таблиц на .NET.

            Но задачи все - с кучей точек где что-то дописать, спросить, обсудить.


            1. talebin
              29.10.2025 09:21

              Понял вас, спасибо за пояснение. Тогда мой комментарий нерелевантен.

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


    1. axion-1
      29.10.2025 09:21

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


  1. yadobr
    29.10.2025 09:21

    Не знаком с leetcode, подскажите, в чем отличия от codewars?


    1. qveex Автор
      29.10.2025 09:21

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

      Плюс слышал, что тесты там сложнее пройти и они мене щадящие

      Сам давно туда не заходил, Литкод просто показался больше юзер френдли, поэтому остановился на нем


    1. domix32
      29.10.2025 09:21

      leetcode и hackerrank просто считаются "более профессиональным" т.к. позволяют получить некоторую сертификацию за отдельную плату. А так площадок подобного рода уже немало. Та же code kata, например.


  1. sunnybear
    29.10.2025 09:21

    Если 600 дней тратить по 2 часа, можно неплохой дом построить. Или на квартиру накопить.


    1. DarthVictor
      29.10.2025 09:21

      Если 600 дней тратить по 2 часа, можно неплохой дом построить. Или на квартиру накопить.

      1200 часов — это семь с половиной месяцев. При средней зарплате, показываемый сейчас Хабром для мидл-разработчика квартирку придётся брать где-нибудь в Воркуте.


      1. n0isy
        29.10.2025 09:21

        Ну и? Квартира в Воркуте может быть лучше, чем 1200 часов в литкоде.


    1. domix32
      29.10.2025 09:21

      Кажется, когда зарабатываешь по МРОТ в час про литкоды думать уже и не надо.


      1. fugal-fringe-0p
        29.10.2025 09:21

        ..а вот о Воркуте задуматься стоит.


    1. tommyangelo27
      29.10.2025 09:21

      ну или выбить несколько ачивок в EuropaUniversalis4


  1. Panzerschrek
    29.10.2025 09:21

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

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

    Сложность задач (easy/medium/hard) весьма тролльская. Некоторые easy задачи всё-же требуют написание немалой портянки кода для решения. Половина medium задач вполне себе тяжёлые и или не поддаются вовсе, или требуют от часа времени мозговых усилий.

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


    1. urvanov
      29.10.2025 09:21

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


      1. Panzerschrek
        29.10.2025 09:21

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


        1. Keeper22
          29.10.2025 09:21

          не было алгоритмических собеседований

          Отрицательный результат -- тоже результат.


  1. urvanov
    29.10.2025 09:21

    А тамошних монеток-то хоть нафармил сколько-нибудь? Ачивки все закрыл?


    1. qveex Автор
      29.10.2025 09:21

      Конечно

      Не сказать, что много, сейчас в районе 5т монеток

      Ачивки в основном за дни активности дают

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


  1. Dywar
    29.10.2025 09:21

    Тоже иногда решаю литкод.
    Мне нравится ощущение когда ты решил задачу, накатывают позитивные эмоции :)
    Есть ли польза? Я думаю что есть, иногда на работе нужно написать алгоритм сортировки с несколькими условиями или обойти дерево. Их решение уже не вызывает трудностей как раньше.
    Сейчас есть ИИ, много бесплатных, которые напишут тебе нужный алгоритм, и тесты к нему, это будет быстрее чем делать самому. Надо ли самому что то делать или уже нет, каждый сам решит. Я продолжу решать сам для себя, не так часто как раньше конечно, но думаю что это полезно, и когда мне будет лень, то передам это ИИ.


  1. vasiliy_moscow
    29.10.2025 09:21

    Дофаминовая зависимость или как правильно называется то о чем пишет автор статьи? Напишите кто разбирается.


  1. Kahelman
    29.10.2025 09:21

    • fun canPlaceFlowers(flowerbed: IntArray, n: Int): Boolean { if (n == 0) return true var remaining = n var i = 0 while (i < flowerbed.size) { if (flowerbed[i] == 0) { val prev = if (i == 0) 0 else flowerbed[i - 1] val next = if (i == flowerbed.size - 1) 0 else flowerbed[i + 1] if (prev == 0 && next == 0) { flowerbed[i] = 0 remaining-- if (remaining == 0) return true i++ } } i++ } return remaining == 0}

    Вы только что показали. Почему ваш восход ни к чему не приводит. В вашем, так называемом «высокоскоростном» решении, нет ничего высокоскоростного и оптимизированного. Так нормальные люди писали код пока не набежали фанаты цепных вызовов и не стали говорить что это круче.

    У вас идёт проверка условий и доступ к массиву для prev и next, которые не нужны и могут быть оптимизированны


    1. qveex Автор
      29.10.2025 09:21

      Код без цепочки вызовов - не мой

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

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

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

      Все зависит от вашей цели. Если нужна производительность - придется писать обычный код


      1. Kahelman
        29.10.2025 09:21

        Претензия не е коду, а к вам. Вы привели его как пример высокоскоростного решения. Как пример «нормально решения» он подойдёт, но говорить о том что это оптимизированный код нельзя. Это просто «тупой» код для решения задачи как он должен быть. Тупо, понятно, легко транслируется на любой язык.


      1. Source
        29.10.2025 09:21

        Цепные вызовы и правда стабильно хуже в производительности

        А в Kotlin разве нет lazy-evaluation? Обычно это позволяет писать код обработки массивов в виде цепочки вызовов, а в итоге выполнять все эти действия за 1 проход.


        1. qveex Автор
          29.10.2025 09:21

          Есть похожий механизм - Sequence

          В некоторых кейсах он может дать буст, но это вообще не панацея

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


  1. andrsam
    29.10.2025 09:21

    Проходил курс Grokking на educative.io. Принцип построения материалов неплохой - сначала демонстрируется примерное решение на основе псевдокода, затем ты пытаешься его выполнить, далее сверяешься с ответом. На практике, большую часть заданий приходится решать через воспроизведение кода из ответов по памяти. Это страшно демотивирует. Как научиться решать задачи самому без зубрёжки?


  1. jirdis
    29.10.2025 09:21

    Не уважаю казуалов, уважаю только hard, только жесть. Грудью на танк! С ноги в толпу!


  1. DaggerMouse
    29.10.2025 09:21

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

    С тех пор я поменялся, вырос над собой, стал сильнее
    Биться за идею стало проще


  1. Femistoklov
    29.10.2025 09:21

    Дополнил:

    А надо ли оно? Для точного ответа на этот вопрос важно ответить на уточняющие:

    • Вы работаете с высоконагруженной системой?

    • Хотите ли вы попасть в бигтех?

    • Вас привлекают алгоритмы и приносят вам радость?

    • У вас нет профильного высшего образования?

    • Вы не участвовали в олимпиадах по информатике?


    1. Kahelman
      29.10.2025 09:21

      • У вас нет профильного высшего образования?

      Так будет правильнее


  1. alkneu
    29.10.2025 09:21

    ez katka


    1. qveex Автор
      29.10.2025 09:21

      Больной человек!) В хорошем смысле)

      Я довольно часто натыкаюсь на дейли, которые не могу решить

      Из-за этого так ни одной медальки за месяц и не получил

      Ваша выдержка и скилл алгоритмов явно на несколько уровней выше


    1. T-D-K
      29.10.2025 09:21

      =)


      1. alexandr93
        29.10.2025 09:21

        Записную книжку с Big O заказали?)


        1. T-D-K
          29.10.2025 09:21

          Не увидел для себя смысла в нёй. Я взял набор "t-shirt, keychain and coaster". Подставкой под кружку пользуюсь каждый день на работе. Вообще ради неё и брал набор.
          Ещё осталось чуть больше 12К коинов. Пока не придумал куда их деть.


      1. alkneu
        29.10.2025 09:21


  1. axion-1
    29.10.2025 09:21

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

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


    1. alexandr93
      29.10.2025 09:21

      Там сложность непонятно как оценивается. Есть задачи на easy, которые не самые простые. А есть задачи hard, которые в одну строчку-формулу решаются.


      1. urvanov
        29.10.2025 09:21

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


  1. agoncharov
    29.10.2025 09:21

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


  1. Merkan
    29.10.2025 09:21

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


  1. Ratenti
    29.10.2025 09:21

    Тебя взяли в Google?


  1. Anfet
    29.10.2025 09:21

    Все бомбически, вот только откуда столько свободного времени? Имея основную работу + подработку, выходит по 10-12 часов занятости. Какой литкод, ррработать.


    1. qveex Автор
      29.10.2025 09:21

      На easy/medium задачи уходит не так много времени, как может показаться (до часа максимум, а иной раз можно и за минуту решить, если совсем легкая)

      Это как раз мой основной поинт, почему не трогаю hard - экономия времени


      1. alexandr93
        29.10.2025 09:21

        Особенно мне интересно как люди решают контесты. Там вроде как 4 задачи. И есть довольно сложные. И вот топовые китайцы решают всё минут за 10-20. Вот это кажется вообще нереальным.


        1. qveex Автор
          29.10.2025 09:21

          Для меня это даже сейчас звучит как что-то нереальное

          Кажется, люди этим всю жизнь занимаются, либо реально гении


        1. domix32
          29.10.2025 09:21

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


          1. sci_nov
            29.10.2025 09:21

            Китайцы после обеда спят, потом работают. Может, в этом секрет?)


            1. domix32
              29.10.2025 09:21

              Их просто много и у них хардкорная конкуренция за хорошие места во всех сферах. Именно поэтому большинство победителей мат.олимпиад по миру тоже имеют узкий разрез глаз. Интереса ради можете посмотреть как выглядит какой-нибудь Gaokao и сравнить с экзаменами МГУ/МФТИ/МИФИ.


              1. sci_nov
                29.10.2025 09:21

                Боком им потом это выйдет. Хотя роботам сойдёт)


                1. domix32
                  29.10.2025 09:21

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


                  1. sci_nov
                    29.10.2025 09:21

                    Индия, в целом, гораздо больше ориентирована на духовность, чем Китай. Индия ближе к России. Пусть прижимают)


  1. sci_nov
    29.10.2025 09:21

    Есть люди, которые решают интегралы и выкладывают многочасовые видео...


  1. supremum76
    29.10.2025 09:21

    Я узнал, что такое лидкод :)

    Нас учили на кафедре, все эти штучки дрючки конечно прикольно, но в российской реальности кормить вас будут 1С и эскуэль :) Так реально и выходит.


  1. Pifarh
    29.10.2025 09:21

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


    1. alexandr93
      29.10.2025 09:21

      Нейросетки знают решения и из них очень трудно выудить что-то, что не заложено в стандартные решения. К примеру, была задача, где надо было раобтать с элементами в изменяющемся массиве и авторское решение было с деревом Фэнвика. И нейросетка только про это решение долбила. А я хотел проконсультироваться про другое, но нейросетка долбила, мол только дерево Фенвика, хотя есть и другая реализация у дерева отрезков. Просто нейросетка знает авторское решение и ни в какую не отклоняется от него. Хотя другое решение таки было засабмитано, то есть оно есть.


  1. sinuke
    29.10.2025 09:21

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

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


    1. qveex Автор
      29.10.2025 09:21

      Согласен с вами

      Тоже считаю, что решение первой попавшейся задачи дает крайне мало профита в последнее время

      Кажется, что просто не хватает какой-то глобальной цели и плана

      Иначе так можно и застрять на каком-то уровне

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

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


      1. sinuke
        29.10.2025 09:21

        Я попробовал зарегистрироваться на тренировки по алгоритмам от Яндекса в этом году. Отвалился в первый же день =)) И вот почему:

        • Задачи не самые простые, я бы сказал medium+. Т.е. времени на само решение нужно потратить немало

        • Во многом тесты придумывать самому, что тоже время

        • Решение нужно оформлять практически как полноценный проект с импортами (не так как на LeetCode, где просто решаешь). В общем, это тоже время

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


        1. qveex Автор
          29.10.2025 09:21

          Получается полноценное обучение прям, а не по 15 минут в день на литкод потратить

          Нужно собираться с мыслями и конкретно тратить время) Не каждый готов к такому