Как стать автором
Обновить

Комментарии 407

ЗакрепленныеЗакреплённые комментарии

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

Учебник Дасгупты, Пападимитриу, Вазирани — мой любимый! Я его когда-то давно на русский и перевёл (пдфка — здесь). Через какое-то время после этого мы с Павлом Певзнером (профессором UCSD, одним из лучших биоинформатиков в мире) написали интерактивный учебник по подготовке к алгоритмическим собеседованиям.

По дискретной математике очень люблю эти два недавних учебника:

Создал свой канал с уроками по решению leetcode задач https://www.youtube.com/@idsulik , буду рад если будет кому-то полезно.
Это мой первый опыт во всех аспектах(съемка, урок, монтаж и т.д.), поэтому просьба строго не судить, но рад любой конструктивной критике, подпискам и лайкам)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

:D к примеру)

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

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

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

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

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

Интересная идея, надо попробовать

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

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

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

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

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

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

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

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

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

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

В нашем детстве РФ вообще не было, поэтому и сравнивать некорректно:) А тихо и спокойно, как в «застойном СССР» (в хорошем смысле) в мире много где, было бы желание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contest Rating / Global Ranking ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

может быть)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Фундамент о котором вы говорите, может освоить на 100% среднестатистический разработчик? Если нет, то это говорит о том, что они не компетентные?

а я где-нибудь писал, что не может освоить?) все могут

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не совсем так. Для меня "пригодилось" означает значительно на что-то повлияло. Есть яркий пример из опыта: Если в 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 минут чтобы разобраться и переписать этот код в более рабочий вид. Один раз за проект.

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

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

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

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

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

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

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

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

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

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

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

Если в кратце и не изменяет память - пробовал фильтр Калмана (не вышло). Потом построил решение на основе отброса подозрительных точек + алгоритм Дугласа Пикера.

Подозрительные точки - зависит от того, какие данные у вас есть. У нас были показатели точности gps, скорости, ускорения и таймстемпы. Отбрасывал слишком большие значения. Например точность координаты 100 метров - смысл ее учитывать. Или не реальные значения. Например у нас были пешеходные треки и человек не мог телепортироваться на 1000 метров за 1 секунду.

Поищу код и материалы - найду выложу и напишу в личку ссылку.

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

И труднее всего было с Нью-Йорком с его небоскребами.

спасибо, пригодится. Если что-то найдете - буду благодарен. У нас показателя точности пока нет, как раз над этим сейчас работаем

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

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

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

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

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

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

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

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

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

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

Доперло.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Учебник Дасгупты, Пападимитриу, Вазирани — мой любимый! Я его когда-то давно на русский и перевёл (пдфка — здесь). Через какое-то время после этого мы с Павлом Певзнером (профессором UCSD, одним из лучших биоинформатиков в мире) написали интерактивный учебник по подготовке к алгоритмическим собеседованиям.

По дискретной математике очень люблю эти два недавних учебника:

Да, у меня оно как раз в вашем переводе 2014 года :)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо!)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Hidden text

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

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

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

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

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

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

Hidden text

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

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

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

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

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

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

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

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

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

Hidden text

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

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

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

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

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

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

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

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

Кто хочет устроить некий баттл?) На время решить 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/...)

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

Hidden text

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

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

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

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

Вот только не надо 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).

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

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

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

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

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

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

Это легко :))

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

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

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

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

На самом деле решение 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);

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

Hidden text

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

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

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

Сейчас бы еще по расходу памяти поколдовать - там я только до 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]++; 
        }
    }
}

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

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

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

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

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

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

2:18

proof

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

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

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

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

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

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

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

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

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

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, если он прошёл мимо.

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

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

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

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

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())

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

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

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

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

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

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

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

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

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

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

Hidden text

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо бро, извини, за невнимательность)

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

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

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

Спасибо)

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

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

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

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

Я после того как один из собесов завалил, начал тренироваться на ЛитКоде. Иногда на одну задачу 3 вечера уходило.

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

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

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

У меня все было так же, но с практикой все встало на свои места) месяцами easy задачи решал за 40 минут и большинство просто подсматривал решение.
а вот сейчас уже прошел несколько собесов, где за 35-60 минут надо по две medium задачи решать) в некоторых даже время оставалось.
продолжайте практиковаться

Отличный результат!

Привет, твоя статься воодушевляет. Можешь дать пару советов новичку? На данный момент нарешал 410 задач на литкоде (340 easy 70 medium). Есть небольшая уверенность в решении, но как только сталкиваюсь с какой нибудь структурой данных отличной от array, hasttable/set,то не могу решить задачу. За все время(1 год) выучил некоторые паттерны в решении. Но плаваю в фундаментальных знаниях. Как ты учил структуры данных? Посмотрев решение, алгоритм понятен, но сама структура не известна(есть понимание только в абстракции). Можешь посоветовать ресурсы для изучения теории?

Привет, спасибо!
Не стоит решать одни и те же задачи на array/hash table/set, если освоил тему, то двигаешься дальше.
https://www.youtube.com/playlist?list=PL3edoBgC7ScWhy0mlNvLPssa_sDGnyUcb
https://www.youtube.com/playlist?list=PLDV1Zeh2NRsB6SWUrDFW2RmDotAfPbeHu

Начни решать задачи на linked list сейчас, как только освоишь эту тему(довольно сложная, тк в голове трудно укладывается связь, когда нужно переворачивать и тд, просто практика, со временем придет понимание), то следующим берешь tree(dfs, bfs, нужно выучить как обходить дерево preorder/inorder/postorder, потом уже можно попробовать делать это как через dfs , так и через bfs), как только освоишь и эту тему, то дальше идешь в сторону графов, тут уже будут знания dfs/bfs, которые для графов тоже понадобятся

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

Спасибо большое за совет. Ты проходил собеседования в фаанг, на какую позицию? Просто сейчас учусь в яндекс практикуме на пайтон разработчика, но видел, что в основном в большие компании для бекенда нанимают java dev, а пайтон для ml. Хочу развиваться именно бэкендером. Можно ли устроиться в крупную компанию питон разрабом?

В faank like компаниях не важно на каком именно ЯП ты программируешь, обычно там пишут что-то типа "any OOP programming language like python, JAVA...", мне лично скаазли, что не важно на каком языке я пишу)
python + django или python + fastapi, популярная связка для backend.
ну и выучишь один язык, поймешь принципы, то выучить другой язык не проблема(я выучил php, потом в течение месяца выучил JAVA и написал android приложение)

Еще раз спасибо. Дай Бог тебе здоровья!

Создал свой канал с уроками по решению leetcode задач https://www.youtube.com/@idsulik , буду рад если будет кому-то полезно.
Это мой первый опыт во всех аспектах(съемка, урок, монтаж и т.д.), поэтому просьба строго не судить, но рад любой конструктивной критике, подпискам и лайкам)

Публикации

Истории