Всем салют!

Хочу рассказать вам историю о том, как я начинал с уровня — «не могу решить даже 1 easy задачу из 10» до уровня — «могу решить каждую вторую medium задачу» и прошел несколько coding сессий в таких компаниях как Meta, Booking, Careem, Avito...

Статистика с leetcode на дату 12.01.2024
Статистика с leetcode на дату 12.01.2024

Началось все с того, что в конце 2022 года я твердо решил, что хочу устроиться в FAANG компанию, но для этого, как вы наверно все знаете, нужны знания алгоритмов и структур данных, коих у меня не было, потому что в обычной работе тебе не нужны heap, tree, disjoint set и другие структуры данных, поэтому начать пришлось практически с нуля.

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

Самое первое, что приходит в голову, когда хочешь начать решать задачи на литкоде — это открыть страницу с задачами https://leetcode.com/problemset/all/ и начать решать их подряд, но это не очень хорошая идея, даже если вы применили фильтр easy, потому что очень много задач с пометкой easy очень сложно решить и это может сильно демотивировать, а то и понизить самооценку.

  1. Первый совет - обращайте внимание на процент Acceptance, чем этот процент больше, тем лучше, потому что это означает, что у многих людей получается решить эту задачу и есть вероятность, что и у вас получится.
    Также можете открыть study plan и попробовать решать задачи оттуда:
    https://leetcode.com/studyplan/top-100-liked/ - Топ 100 залайканных задач, если много лайков, значит есть вероятность, что это не какая-то хитросплетеная задача, которая может понизить вашу оценку(есть много задач для которых нужны специфичные знания и это может быть неочевидно с первого взгляда)
    https://leetcode.com/studyplan/top-interview-150/ - Топ 150 задач для подготовки к интервью, вероятность встретить эти задачи на интервью высока, но тут могут быть сложные задачи, которые трудно будет решить в начале пути
    https://leetcode.com/studyplan/leetcode-75/ - Как пишет leetcode, это "Must-do problem list for interview prep"
    Задачи в этих списках распределены на разные темы, решать нужно их следуя следующему совету.

  2. Второй совет - начинайте с самых фундаментальных структур данных, таких как array(одномерный/двумерный), set, hashmap, они будут встречаться вам постоянно, к примеру, во многих задачах время выполнение можно улучшить добавив set или hashmap(но нужно учесть, что увеличится потребление памяти) и только после того как освоите их, можно начинать углубляться в другие структуры как stack, queue, linked list, tree, graphs.
    На самом leetcode есть карточки, в которых дается объяснение структурам данных и алгоритмам + задачи для закрепления этих тем - https://leetcode.com/explore/learn/ , как и написано выше, начинайте с простых карточек - array, string и постепенно повышайте уровень, я несколько раз возвращался к карточкам, т.к. некоторые моменты порой были непонятны с первого раза, поэтому не думайте, что с вами что-то не так, если что-то непонятно, вернетесь потом и обнаружите, что уже понимаете это.
    https://neetcode.io/roadmap - тут есть roadmap с темами и задачами, очень советую
    https://www.techinterviewhandbook.org/grind75 - можно создать понедельный план с применением различных фильтров
    https://seanprashad.com/leetcode-patterns/ - список из 150 популярных задач, разделенные на темы, сложность и компании

  3. Третий совет - если не можете придумать оптимальное решение, начинайте с решения "в лоб", как только получится, подумайте над тем, как это решение можно улучшить, может можно использовать какую-то структуру? может массив можно отсортировать? а что если использовать set или hashmap? можно ли использовать какой-то шаблон? Если ничего не помогает и вы уже потратили 20-40 минут, то смело открывайте решение задачи и изучайте это решение, как только вы это сделали, закройте решение и попробуйте заново решить(таких итераций может быть несколько, это нормально!), если после нескольких итераций не получилось, просто перепечатайте решение(я неоднократно так делал), НО не забудьте через время вернуться к этой задаче и попробовать решить заново(вполне вероятно, что не получится и это тоже нормально, просто повторяете все шаги заново, у меня бывали случаи, когда я одну и ту же задачу решал и по 10 раз, пока точно не буду уверен, что точно понял)

  4. Четвертый совет - пройдитесь по этим 14 шаблонам https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed , особенно уделите внимание two pointers, sliding window и fast & slow pointers, т.к. они чаще всего встречаются. Берете шаблон, находите задачи под этот шаблон(на странице с leetcode проблемами есть фильтр по тегам, нужно выбрать нужный тег, к примеру "Two pointers" или "Sliding window" и т.д.) и решаете столько задача, сколько нужно, чтоб закрепить эту тему.

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

Минус литкода решили на этой платформе https://firecode.io/ , где задачи даются один за другим, начиная с легких и повторяя уже решенные задачи, чтоб закрепить. Есть объяснение разных тем, после решения задачи можно посмотреть как другие решили, что очень полезно, т.к. ты видишь разные подходы решения одной и той же задачи.

FAQ:

  1. Что делать, если не получается решить задачу?

    Если после 30-40 минут у вас не получилось решить задачу, то посмотрите решение, попробуйте найти видео решение этой задачи, как только посмотрели и разобрали, попробуйте решить заново, если не получилось, еще раз посмотрите и так по кругу. Время от времени возвращайтесь к старым задачам и решайте их заново, особенно если решение какой-то задачи далось вам с трудом.
    Я порой одну и ту же задачу решал по 10-15 раз, а то и больше

  2. Сколько задач нужно решить, чтобы начать откликаться на вакансии?

    Тут все индивидуально, я полгода каждый день решал(сам или с помощью видео) несколько задач, решил где-то 300 задач и только в этот момент почувствовал почву под ногами, а уверенность почувствовал только после решение где-то 400-500 задач. Некоторым достаточно и 100-200 задач, к сожалению я не из их числа.

  3. Какой язык программирования выбрать для решения задач?
    Если коротко - Python.
    Я начинал решать на php, потом перешел на go, после начал решать на java и наконец после просмотра видео https://www.youtube.com/watch?v=0K_eZGS5NsU решил попробовать python и с тех пор решаю на этом ЯП.
    Java - тратишь время на большие конструкции, к примеру - List<Integer> items = new ArrayList<>();
    PHP - путался в аргументах функций, неудобно было в целом писать, хотя практически все время пишу на этом языке
    Go - мало встроенных функций, даже min/max, теперь уже есть, но тогда не было, также нужно конвертировать int в float и обратно, тратишь лишнее время, хотя код и предсказуемый
    Python - лаконичный код, много встроенных функций, которые помогают решать задачи(Counter, defaultdict, divmod, lambda и т.д.), время тратишь именно на решение задачи, а не на печатания и прочее, скорость на собеседовании очень важна.

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

  5. Нужно ли покупать leetcode premium?

    Самое полезное у premium - вы можете посмотреть в каких компаниях давали ту или иную задачу, если вы готовитесь к конкретной компании, то рекомендую, иначе достаточно бесплатной версии, т.к. видео объяснение задачи можно найти на канале Neetcode(ссылка ниже) и т.д.

  6. Стоит ли покупать доступ к educative.io?

    Очень много видел рекомендаций курса Grokking Coding Interview Patterns от educative, но не нашел этот курс очень полезным, единственное понравилось визуальное объяснение, но на мой взгляд лучше посмотреть видео на ютуб

  7. Стоит ли покупать доступ к algoexpert.io?

    На мой взгляд очень полезный ресурс, для каждой задачи есть подробное объяснение, чуть ли не каждое видео по 30-50 минут. На сайте постоянно проходят разные акции и можно ухватить все курсы на год за 99$, адекватная цена, приятный сайт, много тест кейсов для задач и сам редактор приятный и удобный

leetcode rewind за 2023 год
leetcode rewind за 2023 год

Полезные ссылки:

https://www.youtube.com/@NeetCode - пожалуй самый полезный канал, где человек в доступной форме объясняет задачу и решение
https://www.youtube.com/@WilliamFiset-videos - тоже очень много полезных видео с объяснениями разных структур данных
https://www.youtube.com/c/BackToBackSWE - объясняет на доске структуры данных, задачи
https://www.youtube.com/@insidecode
https://www.youtube.com/@geekific
https://www.youtube.com/@MichaelMuinos
https://www.youtube.com/c/NickWhite
https://www.youtube.com/channel/UCMrgnopgrjjIJn-xyYhZ7nA
https://www.coursera.org/learn/algorithms-part1-ru - много рекомендаций, сам не проходил
Рекомендация из комментария:
- Дасгупта, Пападимитриу, Вазирани: "Алгоритмы";
- Axo, Хопкрофт, Ульман: "Структуры данных и алгоритмы";
- Джеймс Андерсон: "Дискретная математика и комбинаторика"

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


  1. idsulik Автор
    13.01.2024 13:58

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


    1. onets
      13.01.2024 13:58
      +6

      600 за год - это 1.5-2 в день. Каждый день. По началу несколько часов на задачу. Работа / семья есть?


      1. idsulik Автор
        13.01.2024 13:58
        +9

        Много задач решал на выходных, когда больше всего свободного времени, а в будни до работы одну задачу и после работы одну задачу(мог открыть несколько и решать только ту, которую понял).
        В начале больше времени тратишь, но через полгода(в моем случае) уже быстрее решаешь, тк уже читая условие задачи примерно понимаешь какую-то структуру/подход надо использовать.
        Если сравнить, то в начале на одну легкую задачу запросто мог потратить 30-40 минут, а потом сдасться, подсмотреть решение и через некоторое время вернуться, чтоб уже самому решить, а сейчас уже успеваю даже по 2 medium задачи за 35 минут решать(к примеру, в Meta было 2 кодинг вью по 45 минут каждая, где тебе дают 2 medium задачи, первые 5 минут на знакомство, последние 5 на вопросы и у тебя только 35 минут).
        А сейчас как минимум решаю daily задачу, делаю это до начала работы


      1. Timrus161
        13.01.2024 13:58
        +39

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


        1. artemfisher
          13.01.2024 13:58
          +17

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


          1. nameless323
            13.01.2024 13:58
            +1

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

            Я этого аргумента если честно не понимаю, ну да, не так работают, вы сели дома за любой тех (не только литкод) и допустим разбираете статью, презентацию, решаете задачу. Ну да, голова не на 100% работает, ну да, допустим на 33.33%, да, вам просто понадобится в 3 раза больше времени но в итоге вы разберете что разбирали и это будет лучше чем садиться со 100% работающей головой раз в 3 месяца. Это как ходить в зал уставшим после работы но постоянно vs сходить на рэндомном выходном раз в пол года


            1. idsulik Автор
              13.01.2024 13:58
              +5

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


            1. quantumwall
              13.01.2024 13:58
              +7

              Мозги у всех по-разному сформированы. Не всегда конечно, но часто после работы совершенно невозможно воспринимать сложную информацию. Садишься за комп изучить какую-нибудь новую тему, открываешь статью/книгу и вместо слов видишь стену символов, мозг просто отказывается что-либо воспринимать. Так что в этом случае даже на 30% работы мозга надеяться не приходится. Мозг хитёр, наверняка он ещё припас достаточно энергии, но как его заставить ее отдать я не придумал


              1. idsulik Автор
                13.01.2024 13:58

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


              1. xSVPx
                13.01.2024 13:58

                Я не знаю кем вы работаете, но точно знаю что при желании 2-3 часа в день можно выкроить всегда

                Неудобно после работы ? Решайте до...


                1. quantumwall
                  13.01.2024 13:58

                  Программистом работаю. Ну а До, проснуться надо ещё)


      1. Vasjen
        13.01.2024 13:58
        +6

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


        1. GospodinKolhoznik
          13.01.2024 13:58
          -5

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


          1. syberpunkq
            13.01.2024 13:58
            +21

            Это скрин с leetcode. Зеленые квадратики есть не только на github


            1. GospodinKolhoznik
              13.01.2024 13:58
              +4

              Понял, тогда приношу свои извинения Vasjen-у. Я так давно не заходил на leetcode (мне больше codewars нравится), что не знал об этой фиче.


              1. zabanen2
                13.01.2024 13:58
                +1

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


          1. Dolios
            13.01.2024 13:58
            +2

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


          1. Vasjen
            13.01.2024 13:58

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


          1. eastywest
            13.01.2024 13:58

            Это не гитхаб, на литкоде так отображется проходжение задач по дням.


          1. s0lgryn
            13.01.2024 13:58

            Мне всё же кажется что это скрин из личного кабинета на литкоде


        1. idsulik Автор
          13.01.2024 13:58

          Согласен, при должной мотивации можно и больше решить)


      1. shark14
        13.01.2024 13:58
        -7

        А в чем проблема с работой? При стандартной пятидневке есть целых 2 выходных, а это достаточно много времени, чтобы и задачки порешать, и спортом позаниматься, на прочие дела и хобби время останется. И вообще на easy задачки нужно минут 15-20 от силы, если напрактиковаться.


        1. NeoNN
          13.01.2024 13:58
          +54

          Люди без детей и семьи такие наивные, и так у них все просто - и в другие страны переезжать, и хоббями заниматься :D


          1. Timrus161
            13.01.2024 13:58
            -1

            оправданий в виде семьи нет, да(


            1. GospodinKolhoznik
              13.01.2024 13:58
              +30

              Я сегодня пошел чистить машину от сугроба, потом прогревал её, потом повез детей к стоматологу, после стоматолога назад. В итоге потратил примерно 4 часа (час чистил и прогревал машину, час туда, час обратно и час у врача) приехал, дети проголодавшись, стал готовить - сначала вареники, потом гречку. Ну так то да, просто отмазки, что времени нет.


              1. idsulik Автор
                13.01.2024 13:58
                +3

                Дети у стоматолога? - берем планшет/книгу и читаем, изучаем пока им лечат зубы.

                Я примерно так и делаю, отвез жену на почту - потратил 5-10 минут ожидания на чтение, пошли в ТЦ, пока жена что-то выбирает, сажусь на скамейку и читаю. Я к тому, что при должной мотивации время можно найти(встать на полчаса раньше, к примеру)


                1. GospodinKolhoznik
                  13.01.2024 13:58
                  +37

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


                  1. idsulik Автор
                    13.01.2024 13:58

                    Пока мне этого не понять, может вы и правы)


                    1. f000
                      13.01.2024 13:58
                      +7

                      Самое лучшее время - когда дети спят ????


                      1. idsulik Автор
                        13.01.2024 13:58

                        :D к примеру)


                      1. Salmoney
                        13.01.2024 13:58
                        +8

                        Цыц, это время для жены =)


                      1. idsulik Автор
                        13.01.2024 13:58
                        +1

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


                1. acsent1
                  13.01.2024 13:58
                  +1

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


                  1. idsulik Автор
                    13.01.2024 13:58

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


              1. Timrus161
                13.01.2024 13:58
                +1

                а завтра что будете делать?


                1. Dmitry_604
                  13.01.2024 13:58
                  +11

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


                  1. N-Cube
                    13.01.2024 13:58
                    -10

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


                    1. kossmak
                      13.01.2024 13:58
                      +4

                      Мир изменился - не так много друзей теперь найдешь погулять на улице. И оставлять дошкольников без присмотра низя-низя.


                      1. N-Cube
                        13.01.2024 13:58
                        -5

                        Гуглим, к примеру «Япония первоклассники одни идут в школу». В Азии так много где, да и не только в Азии. Так что не придумывайте.


                      1. Dmitry_604
                        13.01.2024 13:58
                        +3

                        Предполагаю что они просто идут, т.к. родители работают 9/6/6 или как там. А вот "счастливые дворы полные японских детей весь день играющие на улицах без родителей" сомневаюсь, что удастся нагуглитьь


                      1. N-Cube
                        13.01.2024 13:58
                        -2

                        Если вы предполагаете, что Земля плоская, и так далее, это на реальность никак не влияет. Мир большой, и кроме дефолт-сити и дефолт-каунтри очень много мест на планете есть.


                    1. Dmitry_604
                      13.01.2024 13:58
                      +1

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


                      1. N-Cube
                        13.01.2024 13:58
                        -2

                        Ну так речь и шла про детей от 6 лет, это как раз возраст первоклассников (в СССР я сам в этом возрасте в школу пошел, кстати говоря). А уж в деревне летом у бабушек и в лес сами бегали, когда хотели, неужто весь день дома сидеть, абсурд какой. Сейчас в другой стране живем, и тут дети гуляют на улице и во дворах, а не дома запертые сидят. Весь день или не весь, это от детей зависит, но несколько часов родителю на позаниматься своими проектами найдется. Зима, кстати, не везде есть, на географии в школе вам, наверное, рассказывали :) В общем, на детей списывать лень или нежелание родителей - такое себе, совсем не убедительно получается.


                      1. Dmitry_604
                        13.01.2024 13:58

                        Насчет оправданий - тут согласен, что кто сильно захочет - время найдет. Но времени из которого надо выделить кусок на выходных существенно меньше и оно рваное, это факт,. И с нашим поколением некорректно сравнивать - привычки людей в общем и детей в частности изменились сильно (по карйней мере в РФ). Я тоже со 2 класса ездил на транспорте сам и лет с 5 бегал по соседям на даче. Дочку кстати на даче тоже начали еще до школы отпускать.


                1. GospodinKolhoznik
                  13.01.2024 13:58

                  Ну завтра никуда ехать не надо, надеюсь посвободнее будет. Скорее всего какое то время у меня будет, но это не так, что целый день мой и могу заниматься чем хочу. В принципе у меня бывает свободное время, но его не так много, чтобы на литкод тратить по 10-15 часов в неделю. И если время появляется, то я стараюсь его тратить хотя бы сколько то на свой проект, а не на нарешивание задач.


                  1. idsulik Автор
                    13.01.2024 13:58
                    +1

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


                    1. domingocolombo
                      13.01.2024 13:58
                      +2

                      В том и дело, что 15-30 минут всего) За это время только в тему кое-как въехать успеваешь. Да и честно говоря, со всеми домашними делами, приоритеты, при всём желании, тоже на фиг идут часто.

                      С одной стороны я полностью понимаю тех у кого есть дети (наличие жены без детей не считаю семьёй в полной мере; без обид, но это вообще разные вещи). С другой - я не понимаю родителей, которые в комментах пишут "без семьи то легко, а с семьей то всего не успеешь". Ну да, так и есть, но зачем это писать? Просто пожаловаться? Я, когда сын был совсем маленький, по-другому это коллегам доносил. Говорил: "пока детей нет, старайтесь побольше учиться, потому что с маленькими детьми вообще не до этого будет". А не злился с тем посылом, мол "без детей то вам легко говорить". Короче, поменьше друг на друга стоит огрызаться обеим сторонам.


                      1. idsulik Автор
                        13.01.2024 13:58
                        +3

                        Короче, поменьше друг на друга стоит огрызаться обеим сторонам.

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


                      1. Dmitry_604
                        13.01.2024 13:58
                        +1

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


                      1. idsulik Автор
                        13.01.2024 13:58

                        спасибо) надеюсь кому-то будет полезно


                      1. domingocolombo
                        13.01.2024 13:58

                        Да что бы кто не написал всегда будет негатив. Статья кому-то, в любом случае, пригодится. Так что не обращайте внимания. Не читайте комменты либо отключите чувства на время их прочтения). Хотя, особо негатива я сильно не заметил, только вот комменты из разряда "ой, нашли себе оправдание в виде семьи". Собственно, на этот счёт коммент и написал. Но и не стоит вступать в игру "кто лучше знает". Опять же, замечу, что это больше не про вас, а про других комментаторов (по-крайней мере из топ-комментов). Я думаю, даже если 1 совет кому-то одному полезен будет то уже статья не зря написана


                      1. idsulik Автор
                        13.01.2024 13:58

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


              1. piton369
                13.01.2024 13:58
                +1

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


              1. rsmith
                13.01.2024 13:58

                А ведь можно было просто вызывать такси и не жить в часе езды от врача. И вот уже вместо 4х часов потратили бы 2 часа.


                1. idsulik Автор
                  13.01.2024 13:58

                  зависит от места жительства) там где я живу, такси дорогое удовольствие))


      1. qwertyanin
        13.01.2024 13:58
        +1

        что же это за работа, если на ней нельзя решать leetcode?


        1. idsulik Автор
          13.01.2024 13:58
          +2

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


          1. piton369
            13.01.2024 13:58
            +3

            Заметил у Вас двойные стандарты)) Не Вы ли писали, что во время стоматолога можно книжку читат и цитирую "...сама суть посыла - найти время на что-то, что тебе нужно..."?)
            Литкод и/или чтением можно заниматься во время обеда, во время перерыва, в рабочее время, если все дедлайны выполнены, да и просто брать, например, полчаса от рабочего времени периодически, никто от этого не умрёт, кто-то курить ходит, кто-то болтает, кофе пьёт и ваше рабочее время будет с этими людьми одинаковое, если посчитать человеко-часы))


            1. idsulik Автор
              13.01.2024 13:58

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


      1. xaosxaos2
        13.01.2024 13:58
        -3

        easy 2 задачи на несколько часов? Тут уже стоит о другом задуматься, а не о программировании. Easy задача решается максимум за 15 минут, и то это если вдруг вы что-то подзабыли и надо доку глянуть как оно там быть должно.


        1. idsulik Автор
          13.01.2024 13:58
          +2

          Easy задача решается максимум за 15 минут

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

          цитата отсюда https://t.me/faangtalk/19240

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


          1. xaosxaos2
            13.01.2024 13:58
            -2

            Разговор глухонемого со слепым. Зачем втыкать энное количество времени или изобретать велосипед, когда ты не понимаешь? Вы не на собесе у тинькова, это leetcode, что Вам мешает открыть решения других? Посмотреть код, прочитать про алгоритм, посмотреть ютуб? А потом уже реализовать самому, то что узнал, это опять же будет времени максимум на полчаса, нет там олимпиадных задач на уровне easy. Я уже больше года там решаю дейлики. А до этого прошел все курсы, которые были доступны для бесплатного прохождения, вот там уже некоторые медиум задачи могли поставить в тупик.

            P.S. Микроскопом можно тоже гвозди забивать, но проблема же не в микроскопе. Это не умение пользоваться инструментом (не вообще гипотетическим, а который есть под руками).


      1. yrub
        13.01.2024 13:58

        может они всей семьей задачи и решали?))


    1. edogs
      13.01.2024 13:58

      Если у вас есть вопросы, задавайте

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


      1. idsulik Автор
        13.01.2024 13:58
        +1

        Есть и большая, я решал на php/go/java и после видео на канале neetcode решил попробовать решать на python и это был свежий глоток воздуха, потому что ты не тратишь время на большие конструкции как в Java(List<Integer> items = new ArrayList<>()), не вспоминаешь как в php функцию передавать аргументы, потому что там хаос, в случае с go нужно конвертировать в разные типы, что тоже отнимает время и теряется читабельность.
        Python очень лаконичен, есть встроенные функции, которые упрощают работу и на кодинг интервью ни разу не отказывали, когда я спрашивал можно ли использовать встроенную функцию подсчета символов(collections.Counter), к примеру. То есть ты тратишь время только на саму задачу, а не на конструкцию языка.

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

        Очень рекомендую для задач python, легко изучить и использовать


        1. edogs
          13.01.2024 13:58

          Спасибо.

          Задачи на скорость выполнения там присутствуют? Питона для них хватает или иногда всё же приходится компилируемые языки использовать?


          1. avbelyaev
            13.01.2024 13:58
            +5

            Просто задач «на скорость» там нет. То есть если вы написали решение на питоне и оно не проходит по времени, то даже если переписать его на С, все равно не пройдет

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

            В общем читерить таким образом не получится :)


          1. idsulik Автор
            13.01.2024 13:58

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

            p.s. видимо я неправильно понял вопрос, согласен с этим комментарием https://habr.com/ru/articles/786184/comments/#comment_26375388


            1. Dmitry_604
              13.01.2024 13:58

              Серьёзно? Это странно, ведь обычно собеседование под конкретный стек. Но правда иногда говорят что можно писать на псевдоязыке (точнее не слишком соблюдая синтаксис) но все же за основу взят язык на который подаёшься в вакансии.


              1. idsulik Автор
                13.01.2024 13:58

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


              1. dei
                13.01.2024 13:58

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

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

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


                1. Dmitry_604
                  13.01.2024 13:58

                  Я про общение на языке кода на собеседовании, так то понятно что задачи литкода абстрактны от конкретного ЯП и стека


        1. Solberger
          13.01.2024 13:58

          Предать анафеме еретика! Он осквернил святую джаву! :)

          А вообще, не всё ли равно, как там что описывается в самом языке, если большую часть из этого за вас делает IDE? Я надеюсь вы не в самом редакторе LeetCode набираете решение?


          1. idsulik Автор
            13.01.2024 13:58

            В самом редакторе) на реальном собеседовании ты пишешь не в IDE, а в google docs или coderpad и т.п.


            1. Solberger
              13.01.2024 13:58

              Странно. Но видимо у разных фирм свои заморочки на это.

              Проходил собеседование в Тинькофф - была веб-версия нормального IDE, аля IDEA. Что лишний раз показывает ориентированность собеседования именно на проверку архитектурной составляющей программирования, а не на крючкотворство в определённом ЯП.


              1. idsulik Автор
                13.01.2024 13:58

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


    1. nlog
      13.01.2024 13:58

      Contest Rating / Global Ranking ?


      1. idsulik Автор
        13.01.2024 13:58

        Учавствовал один раз в weekly contest, смог решить 2 задачи, 2 не смог(одну из них ,позже выяснил, нужно было решить уравнением Чебышева, а я пытался через DFS/BFS). В будущем планирую учавствовать


    1. Alexander_1995
      13.01.2024 13:58

      Что ты скажешь по поводу поиска ответов(решении ) на таких площадках как bing, gpt и тд ?)


      1. idsulik Автор
        13.01.2024 13:58

        Я решение смотрю на самом leetcode(в editoral/discussion), ищу видео на ютуб и тд
        Если сам не смог решить за 30-40 минут, не вижу смысла насиловать себя, лучше подсмотреть решение и пытаться самому написать, а потом через время вернуться и попробовать повторить(я так мог несколько раз повторять)


      1. dei
        13.01.2024 13:58

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

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


        1. idsulik Автор
          13.01.2024 13:58

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


          1. Dolios
            13.01.2024 13:58

            Есть люди, которые в прямом эфире решают. Это как раз "олимпиадники" и победители соревнований по спортивному программированию, не нужно на них ориентироваться, так же как не нужно вам пытаться 100м пробежать за 10с.


            1. idsulik Автор
              13.01.2024 13:58

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


          1. wataru
            13.01.2024 13:58

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


            1. idsulik Автор
              13.01.2024 13:58

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


              1. wataru
                13.01.2024 13:58
                +1

                Ну, это судьба всех соревнований. Можно, конечно, пилить отдельные лиги по рейтингу. Кое где так и было.

                Но шанс стать лучшим в 5-ой лиге "серебро" вряд ли создаст какой-то особый спортивный интерес. И даже наличие таких монстров, как на скриншоте, интерес не убивает полностью - можно смотреть, как ваш рейтинг растет, вы входите в 10000, 1000, 100 лучших (для этого надо минут за 35 все четыре задачи решить. Тут уже не надо каких-то сверх-способностей. Достаточно опыта и чуть-чуть везения).


                1. idsulik Автор
                  13.01.2024 13:58

                  да, выглядит как хорошая альтернатива, буду двигаться тогда к топ 100 )


    1. otusnoctua
      13.01.2024 13:58
      +1

      Хорошая статья. Успехов в трудоустройстве!


      1. idsulik Автор
        13.01.2024 13:58

        Спасибо большое!)


  1. 19Zb84
    13.01.2024 13:58
    +3

    А куда в итоге устроились ?


    1. Zara6502
      13.01.2024 13:58
      +13

      модератором в leetcode видимо )


    1. idsulik Автор
      13.01.2024 13:58
      +3

      Пока еще в процессе поиска, но уже прошел не одну кодинг интервью, где были как medium , так и hard задачи. Из последних - прошел Avito, Meta(провалил сисдиз этап, сейчас бросил усилия на эту часть).
      Если бы не начал решать эти задачи, то с вероятностью 99.9% я бы провалил все кодинг интервью


      1. 19Zb84
        13.01.2024 13:58
        -1

        А у вас есть свой проект, который вы пишете ?


        1. idsulik Автор
          13.01.2024 13:58

          На данный момент нет, есть работающие пет проекты над которыми работать сейчас нет мотивации


          1. 19Zb84
            13.01.2024 13:58
            -14

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


            1. Dolios
              13.01.2024 13:58
              +5

              А с чего вы взяли, что заниматься программированием, это обязательно пилить пет проект?


              1. 19Zb84
                13.01.2024 13:58

                Я не говорил что пет проект именно и написал, что это лично мое мнение.
                Наблюдение из жизни.


            1. idsulik Автор
              13.01.2024 13:58
              +1

              Ну у каждого свое мнение, тут ничего не поделаешь, наши мнения тут не сходятся)


            1. AllexIn
              13.01.2024 13:58
              +4

              Я люблю программирование. Многие годы занимаюсь им. Есть даже более-менее локально популярные проекты на гитхабе. Но при этом мотивации делать свои пет проекты достаточно мало. Вернее её то очень много, то совсем нет. Так что я бы не сказал, что мотивация делать свой проект отличает хорошего программиста от плохого(которому не надо лезть в профессию).


      1. Dmitry_604
        13.01.2024 13:58
        +7

        Avito и meta интересное сочетание в наше время, а локация какая?


        1. idsulik Автор
          13.01.2024 13:58
          +4

          Армения и Лондон


          1. Dmitry_604
            13.01.2024 13:58

            Тоже интересное сочетание - соответственно :))) Мета лондонская была готова релокацию из Еревана рассмотреть при успехе или как? Гражданство РФ?


            1. idsulik Автор
              13.01.2024 13:58
              +4

              Я не в Армении, но да, Мета была готова релоцировать из моего текущего расположения в Лондон.
              Гражданство РФ


              1. Dmitry_604
                13.01.2024 13:58

                А какая локация и статус, если не секрет был для подачи?


                1. idsulik Автор
                  13.01.2024 13:58

                  ответил в личку)


      1. Farongy
        13.01.2024 13:58

        Если не секрет, какую вилку зп Авито предлагает?


        1. idsulik Автор
          13.01.2024 13:58

          https://getmatch.ru/ - откройте сайт, посмотрите вакансии, там есть оклад)

          p.s. не реклама, сам пользуюсь их ботом и очень доволен, через них и подавался в Avito


          1. Farongy
            13.01.2024 13:58

            Эх. Как-то не густо...


          1. Dolios
            13.01.2024 13:58

            Там требуют регистрацию, чтобы что-то посмотреть.


            1. idsulik Автор
              13.01.2024 13:58

              оно того стоит, на мой взгляд)
              удобный телеграм бот у них, все очень грамотно сделано


              1. Dolios
                13.01.2024 13:58
                +5

                удобный телеграм бот

                Как по мне, так это оксюморон. Имхо, так удобно сделано на https://www.levels.fyi/, где ты на сайте без регистрации, смс и слива данных можешь посмотреть информацию.


                1. idsulik Автор
                  13.01.2024 13:58

                  каждому свое) тоже не люблю боты, поэтому у меня их нет, кроме getmatch, он мне почему-то зашел


        1. Dmitry_604
          13.01.2024 13:58

          Так тут недавно была статья как в Армении из-за падения рубля пересматривали зарплаты в драмах, так что неудивительно что не густо.. Хотя я не смотрел, но полагаю что Зарплата уровня РФ - (минус) "честь работать в нашей компании"


          1. idsulik Автор
            13.01.2024 13:58

            что у них нравится - это возможность получить опыт в highload проекте) плюс много хороших go разработчиков, что в плане опыта было бы очень полезно


  1. Spinoza0
    13.01.2024 13:58
    +10

    И как, пригодились полученные навыки в реальной разработке? )


    1. idsulik Автор
      13.01.2024 13:58
      +7

      Я думаю, что вы также как и я когда-то думаете, что кодинг интервью - это ненужная часть, что эти алгоритмы в обычной жизни не нужны и отчасти это правда, потому что в основном ты делаешь что-то, чему это не нужно(если ты не разрабатываешь сервис для построение маршрутов и тд), но сейчас начал чуть иначе смотреть на код, недавно оптимизировал один метод, который занимал O(N^2) время, сейчас занимает O(N), но да, потребляет O(N) память, в данном случае это было оправдано, тк память лишняя есть, а вот метод вызывался часто и каждая секунда на счету.
      Ты не пытаешься использовать везде массив, а уже смотришь в сторону очередей, стека и тд.


      1. segment
        13.01.2024 13:58
        +5

        сейчас начал чуть иначе смотреть на код, недавно оптимизировал один метод, который занимал O(N^2) время, сейчас занимает O(N)

        Для этого потребовалось решить 600 задач? В чем заключалась оптимизация можете рассказать?


        1. idsulik Автор
          13.01.2024 13:58
          +19

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

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


          1. segment
            13.01.2024 13:58

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


            1. idsulik Автор
              13.01.2024 13:58
              +1

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


              1. dididididi
                13.01.2024 13:58

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

                У меня тоже вопрос результат/вложенные усилия.


                1. idsulik Автор
                  13.01.2024 13:58
                  +8

                  результат - спокойно прохожу кодинг интервью)
                  фитнес для мозга)
                  понимания разных структур данных, алгоритмов, подходов, big O


        1. wataru
          13.01.2024 13:58
          +4

          Для этого потребовалось решить 600 задач?

          Вопрос адресовался не мне, но я свои 5 копеек вставлю: Для этого нужны алгоритмическое мышление, знание нескольких трюков и то, что можно назвать "умение решать задачи" (анализ, моделирование, разбиение, генерация идей и их проверка). Кто-то эти навыки выработает и за 20 задачек и одну книжку, кому-то понадобиться 300, кому-то 1000. Если уж вы нарешали 600, они не все совсем однотипные, и последние 200 вы уже решали практически не копируя код с ответов - то вы эти навыки точно развили.


          1. idsulik Автор
            13.01.2024 13:58
            +2

            да, это я и пытался объяснить тут) но токсичность тут высокая, если кому-то это легко удается, то считают у всех так должно быть


            1. wataru
              13.01.2024 13:58
              +5

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


              1. idsulik Автор
                13.01.2024 13:58

                И вообще, спрашивать это на интервью - ужасная несправедливость.

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


                1. LeetCode_Monkey
                  13.01.2024 13:58
                  -4

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

                  Дрочь литкода в анамнезе уже хороший антипаттерн в этом вопросе.


                  1. idsulik Автор
                    13.01.2024 13:58

                    у каждого свое мнение)


              1. EireenK
                13.01.2024 13:58
                +1

                И вообще, спрашивать это на интервью - ужасная несправедливость.

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

                Кстати, да - тут литкод почему-то не помог: https://habr.com/ru/articles/779538/comments/#comment_26291954


                1. wataru
                  13.01.2024 13:58

                  Вот если бы и у дизайнеров интерфейсов литкод спрашивали, вот тогда бы помогло. /s

                  На самом деле наивно считать, что абсолютно любая система интервью исключит вообще все ошибки вообще в любой области.

                  Хром работает неплохо. По многим тестам - быстрее файерфокса. Кому-то могут не нравиться какие-то фичи, например отсутствие ublock origin, или телеметрия, но как програмный продукт хром - весьма неплох.


            1. AllexIn
              13.01.2024 13:58
              +1

              Это не токсичность. Это защитная реакция на "вы рекламируете то, против чего я настроен".


              1. idsulik Автор
                13.01.2024 13:58

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


                1. AllexIn
                  13.01.2024 13:58

                  Ну вы не воспринимаете свой пост как рекламу. А токсичные комментаторы не воспринимают свои комментарии токсичными. Вы не понимаете друг друга.
                  Я вот попытался вам объяснить. Но видимо не получилось.


                  1. idsulik Автор
                    13.01.2024 13:58

                    может быть)

                    если и рекламирую, то себя, потому что все остальное не мое(сайты, ютуб каналы и тд)


            1. Dolios
              13.01.2024 13:58
              +1

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

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

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

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

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


              1. idsulik Автор
                13.01.2024 13:58

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


    1. shark14
      13.01.2024 13:58
      +4

      100% пригождаются. Постоянно вижу, как на код-ревью от "реальных разработчиков" с опытом 5+ лет прилетает код, который работает за N^2 или даже N^3 на пустом месте.

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

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


      1. Lexicon
        13.01.2024 13:58
        +6

        Вы станете утверждать, что человек, например, посвящающий 2 часа в неделю чтению кейсов производительности и казуальному просмотру роликов об эффективных сервисах хуже подготовлен к "N^2 N^3", чем человек тратящий по 6-12 часов на задачки?

        К своему опыту можно бесконечно апеллировать, я знаю людей с ученой степенью Ph.D, которых она никак не спасает от недостатка опыта построения сервисов. Напротив, кучу времени убьется на выбор самого эффективного алгоритма хеширования, чтобы потом на криворукую реализацию обычных логов 30ms/запрос слить.


        1. shark14
          13.01.2024 13:58
          +1

          Вы явно передергиваете и уходите в крайности. Алгоритмы и структуры — это базовые вещи, фундамент (так же, как и математика), а понимание принципов построения эффективных сервисов и других более прикладных вещей приходит с опытом.

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


          1. idsulik Автор
            13.01.2024 13:58
            +1

            согласен полностью)

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


            1. dididididi
              13.01.2024 13:58
              +1

              Знать фундамент - это прекрасно. Особенно если ты электрику разводишь или крышу стелешь.


              1. idsulik Автор
                13.01.2024 13:58

                Знать фундамент важно во всех областях)


                1. LeetCode_Monkey
                  13.01.2024 13:58
                  +6

                  Знать фундамент важно во всех областях)

                  Нет никаого фундамента. Есть разные специфики деятельности. У Сишного инфраструктурщика одни задачи, у фронтендера совсем другие. От того что дом стоит на фундаменте, кровельщику не нужно знать марки цемента.


                  1. idsulik Автор
                    13.01.2024 13:58

                    кровельщику нужно знать фундамент кровельных работ, сишному инфраструктурщику знать фундамент в своей области) я это имел в виду


                    1. Zara6502
                      13.01.2024 13:58

                      интересно, фундамент, с вашей позиции у всех разный, а leetcode один и задачки всем одинаковые. Так не бывает.


                      1. idsulik Автор
                        13.01.2024 13:58
                        +1

                        под фундаментом я не имел в виду leetcode, а структуры данных)) для решения задач они как раз и нужны, где-то массив, где-то динамический массив, где-то linked list и тд


                      1. LeetCode_Monkey
                        13.01.2024 13:58
                        +2

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


                      1. Antra
                        13.01.2024 13:58
                        +1

                        Если человек прекрасно работает и эффективно решает рабочие задачи, почему вдруг у него возникают сложности с литкодовскими?

                        Я не прграммист, мне не понятно.


                      1. Dmitry_604
                        13.01.2024 13:58

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


                      1. Antra
                        13.01.2024 13:58
                        +2

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

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

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

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

                        Либо же (если бы не знал про такое), просто наваял бы кучу вложенных if'ов и радовался, какую сложную штуку написал ("я ядреный, как кабан").

                        Поэтому и не понимаю позиции "Дрочь литкода в анамнезе уже хороший антипаттерн в этом вопросе".


                      1. LeetCode_Monkey
                        13.01.2024 13:58

                        Поэтому и не понимаю позиции "Дрочь литкода в анамнезе уже хороший антипаттерн в этом вопросе".

                        Потому что есть подозрения что пациент страдает "микроразработкой". Он будет с восхищением оптимизировать кусочкек кода с 0,2с до 0,02с, не видя целостной картины что нафиг это не нужно. Точнее, видя, но особенности психики не позволят ему действительно делать что нужно, а не заниматься очень интересной, но ненужной фигнёй. Возможно такие особенности психики полезы где-нибудь в С и микроконтроллерах, где подобные микрооптимизации восстребованы на каждом шагу.. но не в высокоуровневой разработке.


                      1. LeetCode_Monkey
                        13.01.2024 13:58
                        -1

                        Если человек прекрасно работает и эффективно решает рабочие задачи, почему вдруг у него возникают сложности с литкодовскими?

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


                      1. Antra
                        13.01.2024 13:58
                        +2

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

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

                        Разве вас кто-то стыдит за то, что вы литкод не решаете?

                        А вот вы почему-то гнобите "решающих", в том числе не имеющих за плечами таких проектов.


                      1. LeetCode_Monkey
                        13.01.2024 13:58
                        -2

                        А вот вы почему-то гнобите "решающих", в том числе не имеющих за плечами таких проектов.

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


                      1. idsulik Автор
                        13.01.2024 13:58

                        А как по вашему лучше всего определить хороший программист или нет?) нужно это сделать в реалтайм, чтоб человек не переписывал или просил у кого-то помощи


                      1. Antra
                        13.01.2024 13:58
                        +1

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

                        Но ведь не было такого же?


          1. i86com
            13.01.2024 13:58
            +5

            Алгоритмы и структуры — это базовые вещи, фундамент (так же, как и математика)

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

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


            1. idsulik Автор
              13.01.2024 13:58

              Смотря, что вам нужно) если устроиться в FAANG like компанию, то без этих знаний никуда не пойдешь, также в РФ в крупных компаниях спрашивают.
              У меня была цель научиться решать и проходить кодинг интервью, но в процессе оказалось, что это полезно и интересно, сейчас продолжаю решать для души)


              1. i86com
                13.01.2024 13:58
                +11

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


                1. idsulik Автор
                  13.01.2024 13:58
                  +1

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

                  чем binary tree отличается от binary search tree? зачем balanced tree, если есть обычне деревья? почему MySQL использовать btree дерево, а не binary search tree? почему в некоторых случаях лучше использовать array, а в некоторых linked list?



                  1. KvanTTT
                    13.01.2024 13:58
                    +1

                    почему MySQL использовать btree дерево, а не binary search tree?

                    Насколько я понмю, btree используется в SQL движках, потому что они лучше адаптированы под линейную скорость чтения, а у HDD большая разница между линейным и рандомным чтением. Это тоже как-то тестируется на leetcode?


            1. nameless323
              13.01.2024 13:58
              +2

              Вы контейнеры используете в вашем языке? Представляете когда надо выбрать <array>, когда <linkedList> когда <hashMap> как бы они у вас в языке не назывались? Вот вам и пригодилось понимание структур данных.


              1. DevilDimon
                13.01.2024 13:58

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


                1. idsulik Автор
                  13.01.2024 13:58

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


                  1. DevilDimon
                    13.01.2024 13:58
                    +1

                    Ага, и вставку с удалением накидывать каждый раз? Просто структура с указателем на next малополезна, а на собесе надо за 35 минут два медиума разбить, а не реализовывать структуры с первого курса.


                    1. Dolios
                      13.01.2024 13:58
                      +1

                      Говоришь: "предствим, что у нас есть LinkedList вот с таким интерфейсом, если надо, я потом его реальзую", - и решаешь задачу дальше. Если это не задача на самостоятельную реализацию LinkedList, то это нормально.


                    1. idsulik Автор
                      13.01.2024 13:58

                      @Doliosправильно написал, на собеседовании нет цели тратить твое время на это, если задача не об этом(реализовать Linked list), обычно там говорят, что есть такая структура, к примеру Tree с полями left, right и val, дальше уже отталкиваешься от этого.
                      Ну и обычно на собеседовании код не запускают, главное, чтобы ты написал правильный код, даже если допустил какие-то мелкие ошибки, это не критично


                1. AllexIn
                  13.01.2024 13:58

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


                  1. idsulik Автор
                    13.01.2024 13:58

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

                    я раньше не знал о ней, теперь знаю, понадобится ли - не знаю, полезно ли - знания лишними не будут) понадобится написать автокомплит, буду знать какая структура больше подойдет или на сисдизе попросят сделать сервис для автокомплита


                    1. AllexIn
                      13.01.2024 13:58
                      +5

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


                      1. idsulik Автор
                        13.01.2024 13:58

                        знать полезно базовые алгоритмы и структуры данных, а те задачи(не все конечно), которые я решал лишь закрепляют эти знания + большинство из них нужны просто для подготовки к собеседованию.
                        решил 10 задач с использованием two pointers, тебе будет легче решить 11 задачу, решил 5 задач по binary search tree, следующую решить будет легче и это важно, тк на собеседовании у тебя мало времени


                    1. wataru
                      13.01.2024 13:58
                      +3

                      я раньше не знал о ней, теперь знаю, понадобится ли - не знаю, полезно ли - знания лишними не будут

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


                      1. idsulik Автор
                        13.01.2024 13:58

                        Согласен, сам когда-то думал, что это лишнее и не любил алгоритмические секции на интервью)


                  1. DevilDimon
                    13.01.2024 13:58

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


                    1. AllexIn
                      13.01.2024 13:58
                      +1

                      Ну нет и нет. Через 5 минут будет.


                    1. idsulik Автор
                      13.01.2024 13:58

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


              1. i86com
                13.01.2024 13:58
                +5

                Не совсем так. Для меня "пригодилось" означает значительно на что-то повлияло. Есть яркий пример из опыта: Если в JS написать

                let asd = [];
                asd[10] = 'a';
                asd; // = (11) [empty × 10, 'a']

                то мы получим массив длиной в 11 элементов (первые 10 - пустые).

                В PHP не так:

                <?
                $asd = [];
                $asd[10] = 'a';
                print_r($asd); // = Array([10] => a)
                print_r(count($asd)); // = 1

                Массив с 1 элементом.

                И тут однажды вижу код коллеги-пхпшника, который в JS отправляет массив, в котором индекс - ID пользователя, причём длинный (цифр 7-8).

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

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

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

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


                1. idsulik Автор
                  13.01.2024 13:58

                  Ну это холиварный вопрос) я тоже 8+ лет программирую на разных языках и платформах, запускал проекты с нуля и дорабатывал, хотя вон оказалось, что ни одну задачу не могу решить и не знаю, что такое heap, binary search tree и прочее, был бы я плохим программистом - не могу сказать, но стал ли я теперь лучше относительно себя - однозначно


                1. imanushin
                  13.01.2024 13:58

                  выполнил свою одноразовую операцию

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

                  Но ведь не весь код одноразовый, так ведь?


          1. onets
            13.01.2024 13:58
            +2

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

            А теперь про «настоящие» алгоритмы в моем понимании. Я никогда не решал лит код. Но за 15+ работы у меня было всего ДВЕ алгоритмические задачи.

            Первая, я бы сказал easy - расчет покрытия для фондового рынка. В то время вышел закон для НПФ и указание какие акции облигации фьючерсы опционы они должны закупать для снижения рисков. Там был расчет на основе корреляции по истории цен. Алгоритм был прописан в методичках, его надо было закодить.

            Вторая - я бы сказал hard - сглаживание gps трека. Погуглив, я нашел несколько научных работ объемом по несколько десятков страниц. Сел за их изучение. Но в стартапах же «херак херак и в продакшен». Поэтому сварганил сам на коленке по быстрому. Даже ничетак получилось. Но не без минусов. Так вот эта задача, если подходить ответственно - не час, не день и даже не неделя.

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


            1. Timyrlan
              13.01.2024 13:58

              О, у нас сейчас такая задача по gps. Подкинете ссылок/советов?


        1. oshpeg
          13.01.2024 13:58
          +1

          Не могли бы вы, пожалуйста, привести пример кода O(N^3) из вашей практики?


      1. kalombo
        13.01.2024 13:58
        +4

        Чтобы не делать N^2 на пустом месте достаточно почитать про алгоритмы, а не решать 600 задач по типу "сколькими способами вы проползете лесенку, если за раз вы можете 1 или 2 ступеньки"


        1. idsulik Автор
          13.01.2024 13:58
          +2

          Нужно понимать, что люди разные, одному достаточно 1 раз прочесть про алгоритмы и понять, а другим необходимо по 10 раз перечитывать, чтоб до них это дошло)
          В случае с алгоритмами я второй тип, некоторые задачи решал по 10-15 раз, тк каждый раз упускал какой-то момент.
          И да, мне пришлось решить >600 задач, чтоб почувствовать уверенность в своих силах, но читал, что некоторым достаточно решать 100 задач, некоторым достаточно 300


          1. segment
            13.01.2024 13:58

            Так в итоге то осознали алгоритмы?


            1. idsulik Автор
              13.01.2024 13:58
              +1

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


              1. dididididi
                13.01.2024 13:58

                Меня всегда интересовало. Вот человек сверхалогоритмичен ,может решать задачи, которые мне не снилось.

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

                А тут я выкопал кучу ям - я лучше копаю ямы.

                Ну типа решил 600 задач -x2 зарплата. А тут логика такая типа решил 600 задач - стал лучше решать задачи.


                1. idsulik Автор
                  13.01.2024 13:58
                  +2

                  Я уже несколько раз объяснял, почему именно 600) не было цели решить конкретное количество задач, была цель решить столько задач, чтоб хватило для прохождения собеседований - я достиг этой цели, прошел кодинг интервью в разных компаниях.
                  Почему 600? Тоже ответил, кому-то нужно меньше, мне пришлось больше усилий приложить, видимо не слишком умен)


                  1. dididididi
                    13.01.2024 13:58
                    -2

                    Доперло.

                    Похоже всё ради почесать эго и поднять самооценку. Да и статья подтверждает.

                    Ничего не имею против, хотя сам юзаю более весёлые способы.


                    1. idsulik Автор
                      13.01.2024 13:58
                      +1

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


                      1. dididididi
                        13.01.2024 13:58
                        -1

                        Ну вот видите. Можете формулировать цель.

                        А faang счас вывозит россиян? Я чот думал прикрыли лавочку(


                      1. idsulik Автор
                        13.01.2024 13:58

                        Я же в статье прям в начале это указал) без этой мотивации я бы забросил.
                        Да, недавно Meta активно хайрила, даже в США, но после первого интервью мне отказали, потому что не было рабочей визы США


        1. imanushin
          13.01.2024 13:58
          +1

          Далеко не факт. По моему опыту есть четкая корреляция между "решал много-много Computer Science задач в прошлом" и "быстро замечаю, что система уйдет в N^2". Просто иногда люди решают много задач за год, а иногда это растягивается лет на 10: университет, первые работы (и подготовки), поиск следующей работы и так далее.

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


          1. nronnie
            13.01.2024 13:58
            +1

            а комбинаторика из задачи "сколькими способами вы проползете лесенку, если за раз вы можете 1 или 2 ступеньки"

            Да какая тут комбинаторика - числа Фибоначчи, же, очевидно :)


            1. idsulik Автор
              13.01.2024 13:58
              +3

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


              1. Alexandroppolus
                13.01.2024 13:58

                Очевидно всем кто её решил)


                1. idsulik Автор
                  13.01.2024 13:58

                  по некоторым комментариям ощущения, что один я тупой, а все остальные щелкают эти задачи)


                  1. Alexandroppolus
                    13.01.2024 13:58

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


                    1. idsulik Автор
                      13.01.2024 13:58

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


              1. nronnie
                13.01.2024 13:58
                +3

                На самом деле, практически все задачи на алгоритмы сводятся к не такому уж и большому числу случаев - "разделяй и властвуй", динамическое программирование, или что-нибудь связанное с графами-деревьями. Есть, впрочем, еще всякие "жадные", вероятностные, приближенные алгоритмы, но это уже более редкие случаи, к тому же они чаще всего не рассчитаны на гарантированный и точный результат, т.ч. такие задачи на собесе вряд ли будут :) В случае со ступеньками интуиция подсказывает, что надо попробовать в сторону динамического программирования. Дальше рассуждаем, типа, так: пускай F(N) это искомое решение (N - число ступенек). Мы можем шагнуть на одну ступеньку, а потом пройти остальные F(N - 1) способами, либо шагнуть на две ступеньки и пройти остальные F(N - 2) способами. Т.е. всего способов будет F(N) = F(N - 1) + F(N - 2) - а это и есть те самые числа, что, по-моему, даже в школе учат. Можно решить сразу в лоб за O(N). Есть более мудреный способ за O(log(N)) с матричными вычислениями, но я его так сходу без интернета не вспомню.


                1. idsulik Автор
                  13.01.2024 13:58

                  Да, в статье есть ссылка на 14 шаблонов, как решать задачи)
                  А насчет школы - она у всех разная, я на уроке информатики печатал в word-е, а на числа Фибоначчи, если не ошибаюсь, впервые наткнулся в универе или же когда что-то искал связанное с программированием.
                  Тут почему-то многие думают, что у всех одинаковые школы, универы и развитие одинаковое + нетерпимость к тем, кто на себя не похож


          1. dididididi
            13.01.2024 13:58

            Цикл в цикле видишь - напрягись))) вот тебе n2)


            1. Alexandroppolus
              13.01.2024 13:58
              +7

              Цикл в цикле - не обязательно квадрат. Может быть и O(n).


            1. wataru
              13.01.2024 13:58
              +1

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

              Но чаще всего, это O(n) вызовов линейной функции. Например, n вставок в центр массива. Или самый популярный пример: конкатенация строк в цикле каким-нибудь strcat. Выглядит вполне безобидно.

              Эта штука еще называлась вроде "алгоритм Шмаллиэля" или как-то подобно, но я никак вспомнить не могу (Кто-нибудь помнит ключевые слова? Поделитесь, пожалуйста).

              На эту тему еще анекдот был (пересказ по памяти):
              Нанял хозяин работника забор красить. В первый день тот покрасил 20 метров забора. "Хорошо", подумал хозяин. Во второй день работник покрасил 10 метров. "Странно", подумал хозяин. За третий день работник покрасил только 2 метра. "В чем же дело?", спросил хозяин. "Мне все дальше и дальше ходить к ведру с краской", ответил работник.


              1. Ndochp
                13.01.2024 13:58
                +1

                Алгоритм маляра Шлемиэля, ключевые слова собственно Алгоритм маляра


                1. wataru
                  13.01.2024 13:58

                  Спасибо!


        1. wataru
          13.01.2024 13:58
          +1

          Чтобы не делать N^2 на пустом месте достаточно почитать про алгоритмы, а не решать 600 задач

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


      1. LeetCode_Monkey
        13.01.2024 13:58
        +11

        Постоянно вижу, как на код-ревью от "реальных разработчиков" с опытом 5+ лет прилетает код, который работает за N^2 или даже N^3 на пустом месте.

        Абсолютно грамотное решение разработчиков с реальным опытом.

        а потом через год-два все будут делать изумленные глаза "а что это у нас все так тормозит?

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


        1. imanushin
          13.01.2024 13:58

          Через год-два тот кусок кода будет переписан 20 раз.

          Это, кстати, очень плохо, если не самый тривиальный код переписывают действительно так часто.

          Хотя, возможно, мы говорим про разные компании...


          1. LeetCode_Monkey
            13.01.2024 13:58
            +2

            Это, кстати, очень плохо, если не самый тривиальный код переписывают действительно так часто.

            Не мы такие, требования от заказчика прилетают такие.


            1. imanushin
              13.01.2024 13:58

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

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


              1. dididididi
                13.01.2024 13:58
                +3

                А ещет95 процентов кода в ведро отправляются полностью. Особенно в стартапах. А в другие 95 процентов никто никогда не заходит.


                1. imanushin
                  13.01.2024 13:58

                  А в другие 95 процентов никто никогда не заходит.

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


                  1. Ndochp
                    13.01.2024 13:58

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


                  1. dididididi
                    13.01.2024 13:58

                    Туда поток не заходит.

                    Стоит ифчик и он работает всегда втором направлении.


      1. Alexsey
        13.01.2024 13:58
        +6

        Присоединюсь к мнению что "не все так однозначно".

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

        Нельзя оценивать такие вещи в отрыве от конкретной ситуации, далеко не всегда это делается от незнания алгоритомв.


        1. idsulik Автор
          13.01.2024 13:58

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


        1. wataru
          13.01.2024 13:58
          +1

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

          Эти самые "Алгоритмы" и стурктуры данных, если в них чуть-чуть разбираться, не требуют "трахать мозги" и ухудшать читабельность. Чаще всего оно заключается в использовании какого-нибудь HashMap вместо массива и все.

          А уж когда всякие O(2^N) рекурсивные переборы переписываются динамическим программированием, то там код обычно сокращается в несколько раз и остаются 2 аккуратных цикла и пара строчек комментария, полностью объясняющих, что это за ДП. Даже если в компании нет алгоритмических интервью и не все эти страшные слова знают - достаточно почитать про них в википедии, чтобы понять, что этот код делает.


          1. Alexsey
            13.01.2024 13:58

            Чаще всего оно заключается в использовании какого-нибудь HashMap вместо массива и все.

            Как я уже сказал ранее - ситуации бывают разные и нужно смотреть на конкретных примерах. Я видел сторонников всяческих оптимизаций, которые на 5 записей пихали hashset вместо list и почему-то забывали что insert у hashset совсем не бесплатный и на таком количестве записей будет медленнее чем использовать list.


      1. GospodinKolhoznik
        13.01.2024 13:58
        +2

        И это бекенд, где производительность при росте продукта станет критична, а потом через год-два все будут делать изумленные глаза "а что это у нас все так тормозит? Давайте перепишем с нуля"

        Мой внутренний программист согласен с вами, что нельзя допускать N^2 и тем более N^3, там где можно обойтись N или даже log(N). Но мой внутренний менеджер в тоже время говорит - не страдай ерундой, вероятность того, что через пару лет этот продукт выстрелит, станет популярным и нагрузка на бэк возрастет ничтожно мала. Скорее всего этот продукт вообще нафиг никому не нужен будет и его скоро похоронят. Ну если случится чудо и он взлетит, тогда можно и переписать, привлечь для этого крутых гуру бэкэнд-пикапа.


        1. imanushin
          13.01.2024 13:58
          +1

          привлечь для этого крутых гуру бэкэнд-пикапа

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

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


      1. oshpeg
        13.01.2024 13:58

        Не могли бы вы, пожалуйста, привести пример кода с N^3. Просто интересно…


        1. LeetCode_Monkey
          13.01.2024 13:58
          +1

          Не могли бы вы, пожалуйста, привести пример кода с N^3. Просто интересно…

          Появление "кода с N^3" который лопатит миллионы записей, что серьёзно деградирует производительность - красный флаг что наверняка допущены просчёты в архитектуре приложения.

          Исключения - графические и прочие приложения, работающие с raw данными в огромных объёмах, порой прямо от источника. Но и там грамотная архитектура - делать это на GPU, с тем же N^3.


        1. imanushin
          13.01.2024 13:58
          +4

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

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

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

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


          1. LeetCode_Monkey
            13.01.2024 13:58
            -1

            Разработка (или оптимизация) в первую очередь начинается с research текущего состояния дел для подобного класса задач. Будь то сравнение деревьев или сравнение строк. Через это выходят на самые подходящие подходы, алгоритмы, и вообще best practices. Лопатить литкод для того чтобы "авось пригодится" довольно странно. А если нужного когда-нибудь алгоритма и вовсе ни разу не попадётся?


            1. idsulik Автор
              13.01.2024 13:58
              +2

              Лопатить литкод для того чтобы "авось пригодится"

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


      1. yonesko
        13.01.2024 13:58

        Постоянно вижу, как на код-ревью от "реальных разработчиков" с опытом 5+ лет прилетает код, который работает за N^2 или даже N^3 на пустом месте

        Где N заведомо не больше 5...


    1. LeetCode_Monkey
      13.01.2024 13:58
      +11

      И как, пригодились полученные навыки в реальной разработке? )

      Какой ещё разработке? Литкод он для прохождения собесов и постороения карьеры в бигтехах, а не для работы. Уже можно смело выделять отдельную специальность "литкод-программист".


      1. idsulik Автор
        13.01.2024 13:58

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

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


    1. nameless323
      13.01.2024 13:58
      +2

      Работаю уже больше 10+ лет с кастомными движками игровыми, для развлечения пишу всякую мелочь в виде бесполезной домашней оси и прочее. На работе знания структур данных и алгоритмов нужно постоянно и встречается постоянно. Знание что выбрать массив или связный список в вашем языке это тоже знание алгоритмов. Другой вопрос что прорешивать 100500 литкод задач для этого совершенно не обязательно и имхо нужно только если вам лично нравится решать эти задачки.


      1. idsulik Автор
        13.01.2024 13:58

        да, порой heap поможет быстрее решить задачу, нежели сортировать данные, что обычно занимает nlogn время
        а насчет количества, тут уже все индивидуально, кому-то достаточно 50 задач решить, чтоб понять все, кому-то 200-300, а кому-то все 600 и больше


        1. nameless323
          13.01.2024 13:58
          +1

          кому-то 200-300, а кому-то все 600 и больше

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


          1. idsulik Автор
            13.01.2024 13:58

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


          1. wataru
            13.01.2024 13:58
            +1

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


            1. idsulik Автор
              13.01.2024 13:58

              и это во всем) теория без практики - ничто


            1. nameless323
              13.01.2024 13:58

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


              1. idsulik Автор
                13.01.2024 13:58

                Найти бы такой грамотный курс или книгу) чтоб все было постепенно, с практикой


                1. nronnie
                  13.01.2024 13:58
                  +1

                  Из моей копилки:


                  1. idsulik Автор
                    13.01.2024 13:58

                    Спасибо, добавлю в пост


                    1. nameless323
                      13.01.2024 13:58

                      От себя добавлю разве что классику в виде Кормена, лет наверное 15 назад я по фану проходил курсы Стэндфорда на курсере (вроде они, вот судя по всему ссылка с самого университета, по названию похоже на то что я когда-то проходил, но нет лектора, на курсере тогда были курсы от Tim Roughgarden), само собой не ручаюсь что за эти годы курс не поменялся. Ну и если вам интересен именно ФААНГ то конечно вот эта книга


  1. Lexicon
    13.01.2024 13:58
    +2

    Так, а что дало то? Думаю многие пошли бы бегом решать задачки 24-7, если бы в этом был толк за пределами FAANGов, и то, субъективно, есть другие варианты, - попасть на стартовую позицию или менеджерскую, и позже перейти куда желается.

    C какого уровня как разработчик начинали до начала зубрежки?

    Как долго в карьере? Где работали?

    Почему продолжаете задачки решать?

    И какой толк(если есть) поднимать сложность дальше?


    1. idsulik Автор
      13.01.2024 13:58
      +2

      C какого уровня как разработчик начинали до начала зубрежки?

      Старший разработчик, если я правильно понял вопрос(зубрежка чего?)

      Как долго в карьере? Где работали?

      8+ лет, в разных компаниях.

      Почему продолжаете задачки решать?

      Чтобы держать мозг в тонусе и нет пределу совершенства

      И какой толк(если есть) поднимать сложность дальше?

      Это уже азарт, хочется выше, дальше, быстрее)


      1. orenty7
        13.01.2024 13:58

        Чтобы держать мозг в тонусе

        Кстати, учитывая, что у вас достаточный уровень для прохождения собесов, вы не рассматривали математику?


        1. idsulik Автор
          13.01.2024 13:58

          вы не рассматривали математику?

          для чего?) не совсем понял вопрос


          1. orenty7
            13.01.2024 13:58

            В качестве средства поддержания мозга в тонусе


            1. idsulik Автор
              13.01.2024 13:58

              можно, но мне интереснее решать эти задачи)


              1. Alexandroppolus
                13.01.2024 13:58

                Рекомендую попробовать Игры разума - много прикольных паззлов не то что бы на математику, а скорее на логику/смекалку


  1. shnurfik
    13.01.2024 13:58
    -3

    Интересный уровень «не могу решить даже 1 easy задачу из 10», это джун-в-прошлом-газосварщик? По-моему рановато про FAANG думать. У средненького миддла без какой-либо предварительной подготовки хотя бы половина easy должна решаться (а лучше 90-100%).


    1. idsulik Автор
      13.01.2024 13:58
      +5

      Почему рано, если провалил только 1 вью из 5 в Meta? все кодинг сессии и бихейв прошел нормально, провалил сисдиз

      У средненького миддла без какой-либо предварительной подготовки хотя бы половина easy должна решаться (а лучше 90-100%).

      Может быть, но это был не мой случай, я старший разработчик с большим опытом в разных областях(backend/fullstack/mobile/devops), но в основном backend.
      Также есть примеры людей с богатым опытом в разработке, но которым тяжело удаются easy задачи на литкоде. На мой взгляд это отдельный навык, который нужно прокачивать.
      Если вам или кому-то другому удаются задачи легко, я могу лишь позавидовать, тк мне это удалось с тяжелым трудом)


      1. nronnie
        13.01.2024 13:58

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

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


        1. idsulik Автор
          13.01.2024 13:58

          который нужно прокачивать

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


        1. Politura
          13.01.2024 13:58

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


    1. Dakar
      13.01.2024 13:58
      +1

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


      1. idsulik Автор
        13.01.2024 13:58

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


        1. Dakar
          13.01.2024 13:58

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


          1. idsulik Автор
            13.01.2024 13:58

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


            1. Dakar
              13.01.2024 13:58

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


              1. idsulik Автор
                13.01.2024 13:58

                Завидую) если бы мне также легко удавалось, я бы точно не написал эту статью))


              1. LeetCode_Monkey
                13.01.2024 13:58
                +2

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

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


                1. idsulik Автор
                  13.01.2024 13:58

                  ощущение, что все мы работаем в одной сфере и над одним проектом)
                  почему нет предположения, что один люди работают в гейм дев, где нужна геометрия, физика, другие разрабатывают трейдинговые системы, где нужны алгоритмы, а третьи перекладывают json


                  1. Ndochp
                    13.01.2024 13:58

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


                1. Dakar
                  13.01.2024 13:58

                  Так я ж не разработчик. Я сочувствующий. С меня и взятки гладки


  1. FlyingDutchman2
    13.01.2024 13:58

    И сколько всего часов за год ушло на решение всех 600 задач?


    1. idsulik Автор
      13.01.2024 13:58
      +1

      Точное время не скажу, но если коротко, то:
      1. ~час утром и вечером
      2. на выходных до 4-6 часов


  1. nameless323
    13.01.2024 13:58
    -3

    Началось все с того, что в конце 2022 года я твердо решил, что хочу устроиться в FAANG компанию, но для этого, как вы наверно все знаете, нужны знания алгоритмов и структур данных, коих у меня не было, потому что в обычной работе тебе не нужны heap, tree, disjoint set и другие структуры данных, поэтому начать пришлось практически с нуля.

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

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


    1. idsulik Автор
      13.01.2024 13:58
      +5

      Удивляет насолько легко люди говорят за всех) если бы не решал все эти задачи, я бы 100% завалил 99% интервью, смог бы решить задачи типа - узнать является ли строка палиндромом или анаграммой, не говоря уже о backtracking задаче после которой пришлось еще и binary search пройтись, чтоб решить задачу.
      Зависит от того, где вы работаете, если строите сервисы по вычислению маршрутов и тп, где нужны знания алгоритмов, то да, со временем накопите опыт, иначе нет, у меня 8+ лет опыта, но ни разу не приходилось писать merge sort или алгоритм дейкстры и не смог бы решить задачи связанные с ними на интервью, а сейчас - пожалуйста.
      Ну и нужно учесть изначальные знания, кого-то в школе учат программировать на Pascal, а кого-то печатать в word(мой случай)


      1. particleaccel
        13.01.2024 13:58

        Как учите сисдизайн?


        1. idsulik Автор
          13.01.2024 13:58
          +1

          кабанчик(designing data-intensive applications)
          Alex Xu(System design volume 2)
          Видео на ютуб(interview-pen, exponent, ...)
          Статьи


          1. avovana7
            13.01.2024 13:58
            +2

            1. Ещё книжка Web Scalability for Startup Engineers. Вроде как, полегче кабанчика.

            2. Набор задач - Grokking the System Design Interview

            3. Телеграм канал - System Design World



      1. nameless323
        13.01.2024 13:58
        -4

        Ну в таком случае я даже не знаю, я себе это представляю что у человека хотябы уровня мидла+ (а на джуна в фаанг идти не стоит) в ходе работы с языком возникают вопросы - ага, у меня есть контейнер А в языке и контейнер Б, а в чем разница? Как они устроены? Что лучше? Ага, в языке есть функция сортировки, а что там внутри, как оно работает? Просто это фактически покроет 99% фаанговских задачек. В противном случае возникает вопрос почему у человека не возникает таких вопросов при работе с языком, но не отрицаю что возможно в чуждом мне мире вэб программинга что-то работает по другому. Про то что знаний хватает для алгоритмики в фаанге исключительно по моему опыту и опыту знакомых.

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


        1. idsulik Автор
          13.01.2024 13:58

          А к binary search, graph traversal можно самому прийти?) вряд ли кто-то впервые увидел отсортированный массив и подумал, что можно использовать бинарный поиск, также вряд ли, что кто-то увидел граф и подумал, что можно использовать стэк для обхода в глубину и очередь для обхода в ширину. Это такие же знания, которые нужно приобрести, как и алгоритм дейкстры, да , алгоритм дейксты более сложный алгоритм, нежели другие, но и тому и другому надо научиться) кто-то делает это в школе, кто-то в универе, а кто-то Я) в работа никогда не пригодилось, но теперь я все это знаю и могу пройти большинство кодинг интервью, то есть цель выполнена)

          https://habr.com/ru/articles/786184/comments/#comment_26374766


          1. nameless323
            13.01.2024 13:58

            А к binary search, graph traversal можно самому прийти?)

            Обратите внимание как вы будете слово в словаре искать. Если слово начинается на F вы откроете словарь примерно в середине, попадете на какой N, подумаете что F раньше, примерно откроете словарь на середине первой половины и т.д.

            Graph traversal - как обойти что-то у чего есть соседи? Взять это что-то и пройти по всем соседям. Но у этих соседей есть еще соседи, берем каждого соседа по очереди и обходим их соседей. Что вы там конкретно навесите, стэки, очереди на массивы размапите, линкед листы и т.д. дело десятое. Попробуете одно, не получится, попробуете другое - ага, я храню соседей в структуре А, мне становится не удобно, может надо стуктуру Б - меняем.

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


            1. idsulik Автор
              13.01.2024 13:58
              +1

              Ну видимо в Гарварде просто так преподают все это, объясняют бинарный поиск и все остальное)
              Опять же, почему на Хабре многим кажется, что если им и может их знакомым многое известно, то это должно быть известно и другим?) нет даже предположения, что люди разные


              1. nameless323
                13.01.2024 13:58

                Опять же, почему на Хабре многим кажется, что если им и может их знакомым многое известно, то это должно быть известно и другим?)

                Я скорее к тому что по идее все это скорее всего накопится из простого любопытства уровня "у меня есть в языке hash_map, а как он внутри устроен? а есть sort, а как он сортирует? а как можно?" за несколько лет программинга. Но в общем то да, у каждого свой путь и согласен что у меня неплохой биас из за того что я в школе начинал как олимпиадник (потому что было по фану), в универе продолжил им быть и учился на математической специальности, а сейчас уже 10+ лет работаю на плюсах в очень алгоритмически тяжелой сфере (и знакомые из той же сферы).

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

                Вам в общем то респект за проделанный труд и за целеустремленность и желаю вам только успехов)))


                1. idsulik Автор
                  13.01.2024 13:58

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

                  По моему личному мнению литкод ради фаанга это не очень мотивация

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

                  Спасибо!)


                  1. nameless323
                    13.01.2024 13:58
                    +2

                    Мотивация «литкод ради фаанга» пропадет как только вы попадете в фаанг, мотивация «потому что это офигенно» - вечна)


                    1. idsulik Автор
                      13.01.2024 13:58

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


                    1. otusnoctua
                      13.01.2024 13:58
                      +2

                      Мне кажется, что первое вполне способно перерасти во второе)


                      1. idsulik Автор
                        13.01.2024 13:58
                        +1

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


            1. Alexandroppolus
              13.01.2024 13:58

              Обратите внимание как вы будете слово в словаре искать. Если слово начинается на F вы откроете словарь примерно в середине, попадете на какой N, подумаете что F раньше, примерно откроете словарь на середине первой половины и т.д.

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


              1. idsulik Автор
                13.01.2024 13:58
                +2

                впервые слышу про интерполяционный поиск)


    1. alelam
      13.01.2024 13:58
      +4

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


      1. idsulik Автор
        13.01.2024 13:58

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


      1. nameless323
        13.01.2024 13:58

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


        1. idsulik Автор
          13.01.2024 13:58

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


    1. gatoazul
      13.01.2024 13:58
      +4

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


      1. dididididi
        13.01.2024 13:58

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


        1. gatoazul
          13.01.2024 13:58
          +1

          И математика иногда нужна. И основы эргономики. И даже бухгалтерский учет. А еще прием Геймлиха.

          Но упарываются почему-то только по алгоритмам.

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


          1. idsulik Автор
            13.01.2024 13:58

            Потому что алгоритмы требуют на интервью, а моя цель была интервью) если бы требовали математику, я бы бросил усилия на это


            1. gatoazul
              13.01.2024 13:58
              +1

              Вот это честный ответ. А то начинают, бывало: без знания алгоритмов никуда, видел один раз страшный случай про O(1000); или "это очень развивает ум".

              А вам желаю всяческих успехов.


          1. Solberger
            13.01.2024 13:58

            Так алгоритмы и есть часть математики. И проверяют их из-за повсеместного использования, в отличии от остальных частей (аля интегралы и дифф).


            1. gatoazul
              13.01.2024 13:58
              +1

              Достаточно сомнительное утверждение.


  1. Algrinn
    13.01.2024 13:58
    +1

    Каждый развлекается как хочет. :-) Возможно целесообразнее пройти сертификацию. Получить себе бумагу, что ты Java Super Puper Professional.


    1. idsulik Автор
      13.01.2024 13:58

      целесообразность у каждого своя) думаю Java Super Puper Professional сертификат тоже кому-то нужен, к примеру, если хочет получить o1/eb1 визу и нужны любые доказательства твоей экстраординарности)


    1. Alexandroppolus
      13.01.2024 13:58

      Смотря где трудоустраиваться. В российском IT никто не верит бумагам.


      1. idsulik Автор
        13.01.2024 13:58

        зависит от бумажки, я к примеру проходил сертификацию под контролем человека, то есть серьезно проверялись знания kubernetes) вроде такие же сертификации есть для aws и тд


    1. imanushin
      13.01.2024 13:58

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


  1. Alexandroppolus
    13.01.2024 13:58

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


    1. idsulik Автор
      13.01.2024 13:58

      5 medium, 11 hard..ничего себе) я много страдал, пока не дошел до medium/hard.
      если есть цель, можно вернуться и продолжить, благо меня на плаву держала цель, иначе тоже забросил бы через месяц


  1. abylai_o
    13.01.2024 13:58

    Вы после решение 600+ кем себя ощущаете juniorom или middle?


    1. idsulik Автор
      13.01.2024 13:58
      +1

      Решение задачи не влияет на junior/middle уровни) считаю, что из уровня junior решения подобных задач я перешел на middle(повторюсь - именно в решении задач, а не как разработчик)


      1. Alesh
        13.01.2024 13:58

        Каков был профит по ЗП? Удалось ли устроится на более высокую и на сколько? И хватилоли литкода без практических знаний стеков и технологиий?


        1. idsulik Автор
          13.01.2024 13:58

          Не знаю как литкод поможет в увеличении ЗП) разве что поможет устроиться в фаанг подобные компании , а там уже будет более высокий оклад


          1. Alesh
            13.01.2024 13:58

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

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


            1. idsulik Автор
              13.01.2024 13:58

              Прокачали вы технологический стэк, как это поможет попасть в ФААНГ? я же в статье написал, что цель была туда попасть и чтобы туда попасть, нужно пройти алго интервью, который я бы 100% не прошел, если бы не решал эти задачи


              1. Alesh
                13.01.2024 13:58

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


  1. MapleBloom
    13.01.2024 13:58

    Недавно взялась за задачки на литкоде, чтобы не просто говорить про О(N^x) - читай, сколько циклов вложено, а посмотреть как разные реализации кода работают. Получается не очень информативно, т.к сабмиты одного и того же кода могут давать от 70 до 99% по времени. Т.е разброс по времени одного алгоритма получается существенно больше, чем разница в запуске альтернативных решений. Не сравнить.

    У вас же хотела спросить про потребление памяти на литкоде. У меня получается, что даже алгоритмы, не требующие каких-то доп.структур, только пару int, жрут от 17Mb и выше. Без возможностей оптимизации. К примеру:

    Какое минимальное потребление памяти было у вас на задачках без хранения объемных структур, кэширования?

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


    1. idsulik Автор
      13.01.2024 13:58

      Я не старался угодить runtime/memory литкод, если того не требует сама задача, тк эти значения прыгают и связано это скорее всего с тем, что разные запуски могут происходить на разных серверах с разными по мощности железу.
      одно дело, если решили задачу в лоб и хотите оптимизировать, а так я бы не стал заморачиваться)


    1. Dolios
      13.01.2024 13:58
      +1

      Оценка времени/памяти на литкоде +/- лапоть, не нужно на нее ориентироваться. Важна только асимптотическая сложность.

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


    1. wataru
      13.01.2024 13:58

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

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

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


      1. idsulik Автор
        13.01.2024 13:58

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


        1. kdpdev
          13.01.2024 13:58

          Поначалу заморачивался со скоростью, но отпустило после задачи на расчет количества простых чисел в интервале или что-то такое. Выяснил в литкод можно заливать кода за раз, сделал прекалькуляцию, загнал эту прекалькуляцию в константы что очень сильно разогнало расчеты, в самом начале исходника каментами сформировал ASCII графикой неприличное слово из трех букв, чтобы все видели его, когда полезут смотреть топовый результат. Решение побило 100% всех прочих, но чета не отображалось, если тыкнуть в самый левый столбик. Меня это расстроило, после чего я на скорость\память уже и не смотрел.


      1. MapleBloom
        13.01.2024 13:58

        Про память, которую жрет среда, я понимаю. Но что я делаю не так, если литкод показывает, что мой минимум 17Mb лучше только 5% ? Т.е у других среда компактнее?

        Нет задачи с кем-то соревноваться. Хотела использовать литкод как бенчмарк для своих решений. А так приходится перекладывать задачки локально, генерить объемные данные и прикручивать измерение времени/памяти. Что гораздо информативнее, чем на литкоде, дает стабильный результат при перезапусках, но занимает лишнее время.


        1. wataru
          13.01.2024 13:58

          Может, он с какими-нибудь си++ сравнивает, там поменьше памяти? Может, эти 95% используют на 1 переменную меньше.

          Вообще, посмотрите на график памяти в submission. Большой ли там разброс? Еще там можно ткнуть в столбик и посмотреть пример решения с таким потреблением:

          Hidden text

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

          А еще, один и тот же код потребляет разное количество памяти:

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


          1. MapleBloom
            13.01.2024 13:58

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

            У них, кстати, вышло обновление. Пошла за примером из своих сабмитов, а они, в большинстве своем, пересчитались к 40-70% со стабильных 5% по памяти.

            Но все-равно не понимаю как две int переменные могут уесть 1 Mb памяти по сравнению с другими алгоритмами:

            Hidden text


            1. wataru
              13.01.2024 13:58

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


              1. MapleBloom
                13.01.2024 13:58

                Посмотрела три из лучших по памяти решения, одно из них использует p.sort(). Уверена, что nsmallest под капотом та же сортировка, только возвращает не весь список, а нужное кол-во значений.

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


                1. wataru
                  13.01.2024 13:58

                  Уверена, что nsmallest под капотом та же сортировка,

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

                  встроенные функции на C уже должны давать оптимизацию по времени

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


                  1. MapleBloom
                    13.01.2024 13:58

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

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

                    Hidden text

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

                    Тут интересно было бы посмотреть на результаты соревнований, которые проводятся одновременно, т.е как минимум на одной среде (должны бы?). Но соревнования не для меня - я про подумать, а не про быстро код натыкать ; )


                    1. wataru
                      13.01.2024 13:58

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

                      Должен да. Но обычно ему требуется O(log n) дополнительной памяти. А не всю копию в O(n).


                      1. MapleBloom
                        13.01.2024 13:58

                        Я бы здесь тоже подумала как nsmallest оптимизировать, не выделяя памяти под то, что заведомо не входит в n ; ) Но в описании функции про это не говорят.

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


  1. AlexDerkachev
    13.01.2024 13:58
    +1

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


    1. idsulik Автор
      13.01.2024 13:58
      +1

      Можете скинуть ссылку на оригинал статьи?) и что я рекламирую?)


  1. idsulik Автор
    13.01.2024 13:58

    Кто хочет устроить некий баттл?) На время решить daily задачу и поделиться результатом.
    Ссылка на задачу - https://leetcode.com/problems/determine-if-two-strings-are-close/description/?envType=daily-question&envId=2024-01-14
    Мой результат 13 минут(начиная от чтения условия задачи и заканчивая успешным submit-ом):

    Hidden text

    p.s. set там лишний, но на то это и первое решение)

    В чем смысл баттла?

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

    2. Много было комментаторов, которые писали, что это легко, школьная программа и тп

    Сама задача не требует специфичных знаний(backtracking/dynamic programming/...)


    1. idsulik Автор
      13.01.2024 13:58

      Оптимизированная версия решения(хотя time complexity останется O(nlogn) из-за сортировки, space и там и там O(1), тк количество символов по условию всегда 26):

      Hidden text


      1. wataru
        13.01.2024 13:58
        +2

        По условию алфавит 26 символов. Так что время работы у вас O(n).


        1. idsulik Автор
          13.01.2024 13:58

          если использовать counting sort, если merge sort, то nlogn, разве нет?


          1. wataru
            13.01.2024 13:58
            +1

            Не n log n. n - размер входных данных, размер строки. Сортируются же 2 массива длинной 26. Там код за O(m log m), но m всегда 26. Чуть более точная оценка была бы O(n + m log m), где n - размер строки, m - размер алфавита. Но при фиксированном m это O(n). Еще, при больших алфавитах, когда символ в одно процессорное слово помещатся перестанет, там еще log m какой-нибудь множитель где-то вылезет из-за длинной арифметики.


            1. idsulik Автор
              13.01.2024 13:58

              Что-то chatgpt упорно отвечает nlogn, хотя есть логика в ваших словах) поэтому я в space указал O(1), а time мне тоже казалось, что при использовании сортировки обычно будет nlogn, даже если N - это 26 символов


              1. wataru
                13.01.2024 13:58
                +2

                Вот только не надо chatgpt цитировать. Никогда не спрашивайте у него что-то по теме, в которой вы не специалист. Вы его ответ неправильно интерпретируете.

                Вы же оцениваете скорость работы всего вашего решения. И n там имеет конкретный смысл - длина строк. Да, можно прищуриться, и сказать, что вот этот вот кусок кода - это сортировка и она работает за O(n log n), где n - длина массива. Но, надо не путать это n, с другим n - которое есть размер входных данных вашему решению, т.е. размер строки. Поэтому я их выше разделил и сказал, что сортировка работает за O(m log m).

                Так-то, сложение чисел имеет линейную сложность (сложить n числел - n операций). Вы там в цикле складываете числа - значит у вас решение O(n^2)? Нет же, потому что вы там складываете 1 число. Для этого куска кода n=1. Ваше решение за O(nk), где k - количество сложений для каждого символа. Оно константа, поэтому решение O(n). Точно так же, O(m log m) алгоритм, работающий для фиксированного m не делает ваше решение O(n log n).


                1. idsulik Автор
                  13.01.2024 13:58

                  спасибо, буду знать!


              1. Dolios
                13.01.2024 13:58

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


                1. idsulik Автор
                  13.01.2024 13:58

                  он истек недавно, повторно покупать не стал. Спасибо за скрин


              1. ElectricPigeon
                13.01.2024 13:58

                O(m log m) значит, что с ростом размера входных данных количество затраченных операций будет расти пропорционально m log m. Комментатор выше говорит о том, что размер алфавита фиксирован — с увеличением длины входных строк, сортировка массива длиной с размер алфавита всегда будет занимать одинаковое количество операций (26 * log(26) * const), поэтому это не влияет на общую оценку временной сложности алгоритма.


                1. idsulik Автор
                  13.01.2024 13:58

                  Да, понял, спасибо


    1. nronnie
      13.01.2024 13:58
      +1

      Много было комментаторов, которые писали, что это легко, школьная программа и тп

      Это легко :))

      Решение придумал минуты за две. Код писать не хочу :)
      1. Строим два словаря (для каждой строки) "буква" -> "сколько раз встретилась"

      2. Множества ключей словарей должны совпадать.

      3. Множества значений словарей ("сколько раз встретилась") должны совпадать.


      1. idsulik Автор
        13.01.2024 13:58

        завидую, если так легко удается)


        1. nronnie
          13.01.2024 13:58

          На самом деле решение O(n).

          Hidden text
          // Это даже необязательно, но можно сразу сделать для 
          // ускорения (откидываем сразу очевидный false)
          if(s1.Lenght != s2.Length)
          {
              return false;
          }
          
          var charCount = new int[26];
          
          foreach(var c in s1)
          {
              charCount[c - 'a']++;
          }
          
          foreach(var c in s2)
          {
              charCount[c - 'a']--;
          }
          
          return charCount.All(n => n == 0);
          


          1. idsulik Автор
            13.01.2024 13:58

            Не работает, если я правильно переписал код:

            Hidden text


            1. nronnie
              13.01.2024 13:58

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


              1. idsulik Автор
                13.01.2024 13:58

                лучше сначала сделать с hashset , а потом уже попробовать оптимизировать)


                1. nronnie
                  13.01.2024 13:58

                  И вот она победа :))

                  Сейчас бы еще по расходу памяти поколдовать - там я только до 47,93% дотянул.

                  Hidden text
                  public class Solution {
                      private const int AlphabetLength = 'z' - 'a' + 1;
                  
                  
                      public bool CloseStrings(string word1, string word2)
                      {
                          if(word1.Length != word2.Length)
                          {
                              return false;
                          }
                  
                          CountChars(word1, out var usedChars1, out var charCounts1);
                          CountChars(word2, out var usedChars2, out var charCounts2);
                  
                          if(usedChars1 != usedChars2)
                          {
                              return false;
                          }
                  
                          Array.Sort(charCounts1);
                          Array.Sort(charCounts2);
                  
                          for(var i = AlphabetLength - 1; i >= 0; i--)
                          {
                              if(charCounts1[i] == 0 && charCounts2[i] == 0)
                              {
                                  return true;
                              }
                  
                              if(charCounts1[i] != charCounts2[i])
                              {
                                  return false;
                              }
                          }
                  
                          return true;
                      }
                  
                      private static void CountChars(string word, out int usedChars, out int[] charCounts)
                      {
                          usedChars = 0;
                          charCounts = new int[AlphabetLength];
                  
                          foreach(var c in word)
                          {
                              var idx = c - 'a';
                              usedChars |= (1 << idx);
                              charCounts[idx]++; 
                          }
                      }
                  }


                  1. idsulik Автор
                    13.01.2024 13:58

                    попробуйте несколько раз запустить, там обычно эта метрика скачет)


    1. Dolios
      13.01.2024 13:58
      +1

      Много было комментаторов, которые писали, что это легко, школьная программа и тп

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

      Мой результат 13 минут

      Отличное время, на самом деле. Многие сходятся по мнении, что целевой показатель для подготовки к интервью, способность решить большинство medium задач не более чем за 15 минут дома в спокойной обстановке.


      1. idsulik Автор
        13.01.2024 13:58

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


    1. wataru
      13.01.2024 13:58

      2:18

      proof

      Дольше всего заняло именно осознать задачу и понять, что там надо делать.


      1. idsulik Автор
        13.01.2024 13:58

        круто) 2 минуты - это начиная от чтения и до сабмита или просто набор кода?)
        и можно само решение.


        1. wataru
          13.01.2024 13:58

          Чтение. Код-то быстро напечатать.


          1. idsulik Автор
            13.01.2024 13:58

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


      1. Dolios
        13.01.2024 13:58

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


        1. wataru
          13.01.2024 13:58

          Я еще в начале на таймер нажал. Может это оно?


          1. Dolios
            13.01.2024 13:58

            TIL: на литкоде теперь есть таймер, можно перестать пользоваться своим.

            Спасибо, слона я не заметил :)


            1. wataru
              13.01.2024 13:58

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


    1. mizabrik
      13.01.2024 13:58
      +1

      5 минут и одна неправильная посылка (пытался использовать set как мультисет); переключился на Питон с традиционных плюсов — писать и правда удобнее (:

      Код
      class Solution:
          def closeStrings(self, word1: str, word2: str) -> bool:
              counts1 = Counter(word1)
              counts2 = Counter(word2)
      
              return set(counts1) == set(counts2) and Counter(counts1.values()) == Counter(counts2.values())

      Автору большой респект! Бекраунд у всех разный (у меня, вот, есть 2 года муштры по алгоритмам на Физтехе) и важен именно твой прогресс. Рад, что получилось разобраться и проникнуться алгоритмическими задачками — сам недавно стал переоткрывать для себя этот мир. Ещё могу посоветовать попробовать Advent of Code, если он прошёл мимо.


      1. idsulik Автор
        13.01.2024 13:58

        return counts1.keys() == counts2.keys() and ...

        лучше так, чтоб не создавать лишний set)

        Спасибо, про advent of code слышал, но что-то не вникнул что это такое, надо будет еще раз глянуть


    1. MapleBloom
      13.01.2024 13:58

      Все-равно же остается вопрос: быстро написать так, чтобы приняло, или повозиться и оптимизировать, где можно

      Hidden text
      class Solution:
          def closeStrings(self, word1: str, word2: str) -> bool:
              if len(word1) != len(word2):
                  return False
              if set(word1) != set(word2):
                  return False            
      
              return Counter(Counter(word1).values()) == Counter(Counter(word2).values())


      1. idsulik Автор
        13.01.2024 13:58

        сначала нужно решить хоть как-нибудь, а потом уже оптимизировать)
        в вашем случае нет необходимости создавать set(), тк counter.keys() можно сравнивать


        1. MapleBloom
          13.01.2024 13:58

          Да, но len() и set() сразу исключают неподходящие варианты, т.е в заведомо непроходных случаях не тратится время на 2 Counter.

          А вопрос что выгоднее: каждый раз проверять лишние два set() или считать counter.keys() сравнимым с ним по времени, - на литкоде не решить. Локально получилось, что для латинницы set в 3-5 раз быстрее.


          1. idsulik Автор
            13.01.2024 13:58

            На собеседовании это кстати не так важно, тк time/space complexity не поменяется


            1. MapleBloom
              13.01.2024 13:58

              Не знаю как на собесе, но ту же сортировку пузырьком оптимизируют за счет сокращения внутреннего цикла. Сложность остается O(N^2), но тем не менее говорят об "оптимизированной" сортировке пузырьком.

              Ок, это действительно вопрос целей. Если для собеседования достаточно о-большое, то остальное уже - мои тараканы ; )


              1. idsulik Автор
                13.01.2024 13:58

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


          1. wataru
            13.01.2024 13:58

            Это повлияет на среднее время работы и зависит от распределения разных случаев в тестовом наборе. На leetcode оно может сдвинуть циферку времени работы туда-сюда. Но на O() оно не влияет, потому что им обычно оценивают худший случай (если только специально не сводить все случаи к среднему через рандом, как тот же qsort).


            1. idsulik Автор
              13.01.2024 13:58

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


    1. NightlyRevenger
      13.01.2024 13:58

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

      Hidden text


      1. idsulik Автор
        13.01.2024 13:58

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


    1. SashaZel
      13.01.2024 13:58

      10 мин даже на ЖаваСкрипте, задачу не знал раньше
      (стажер в Яндексе, 37 лет, опыта комм разработки 3 мес)


  1. avovana7
    13.01.2024 13:58
    +1

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

    https://docs.google.com/spreadsheets/u/0/d/1A2PaQKcdwO_lwxz9bAnxXnIQayCouZP6d-ENrBz_NXc/htmlview

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


    1. idsulik Автор
      13.01.2024 13:58

      полезный подход и еще хорошо как-то пометить задачи цветами(green - смог решить сам, orange - удалось с трудом, red - подсмотрел решение), нужно возвращаться к red чаще, к orange реже и к green редко.

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


  1. gybson_63
    13.01.2024 13:58
    +1

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


    1. idsulik Автор
      13.01.2024 13:58

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


  1. kimisa
    13.01.2024 13:58
    +1

    У меня математический подход к решению всех задач с леткода. Т.е. если понял к какой тематике относится задача, то считай она уже на 90% решена.

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

    Нет смысла сидеть и что-то пытаться сделать свое. По сути это просто пустая трата времени. Уже все давно решено и оптимизированно.

    К леткоду нужно просто подходить как к учебнику.


    1. idsulik Автор
      13.01.2024 13:58

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


  1. KvanTTT
    13.01.2024 13:58
    +1

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

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


    1. idsulik Автор
      13.01.2024 13:58

      Мне тоже было неинтересно, но когда появилась цель и мотивация, то пришлось начать, а как только начало получаться, то уже стало интереснее решать и поэтому продолжаю решать, и не собираюсь останавливаться)

      Генератор парсеров - звучит довольно интересно и сложно, удачи!


  1. anonymous
    13.01.2024 13:58

    НЛО прилетело и опубликовало эту надпись здесь


    1. idsulik Автор
      13.01.2024 13:58

      спасибо)
      да, без практики никуда


  1. uDezimiro
    13.01.2024 13:58

    Главный вопрос. Насколько это помогло в реальной работе? Стали ли вы быстрее решать насущные рабочие задачи?


    1. idsulik Автор
      13.01.2024 13:58

      Отвечал уже несколько раз в комментах, в реальной работе не будет сильных изменений, если ты уже старший разработчик с нескольколими годами опыта, но даже так начинаешь иначе смотреть на циклы и писать более оптимизированный код.
      увидел несколько вложенных циклов, сразу думаешь можно ли добавить hashmap и сделать time complexity O(n), если можно, то насколько это будет полезно(ведь space complexity увеличится тоже).

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


  1. Armiol2000
    13.01.2024 13:58

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

    Год назад, когда искал работу тоже ради интереса порешал задачки.. штук 50 прошел разного уровня сложности. Из них штук 40 сам легко находил более-менее оптимальные решения, остальные для оптимальных приходилось подсматривать. Но последующие собесы показали, что никому это не нужно и сосредоточился на изучении нового окружения.

    Кто пишет, что трудно 600 в год осилить.. не трудно, в целом. Вопрос целесообразности. Т.е. можно забить более плотное погружение в язык, его современные тенденции, окружающую архитектуру, забыть про пет проекты и только сидеть и решать задачи. Надо оно? Решать каждому самостоятельно.


    1. idsulik Автор
      13.01.2024 13:58

      Спасибо)

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

      Если сходу получилось решить 40 задач из 50, значит у вас все хорошо с задачами, может база в школе/в универе была хорошей)


  1. Ryav
    13.01.2024 13:58

    А не поделится ли кто инвайтом на Firecode?


    1. idsulik Автор
      13.01.2024 13:58
      +1

      https://firecode.io/pages/beta_invite - запросите тут, я так делал, вроде в профиле не было возможности инвайтить кого-то