2 leetcode medium что это

Обновлено: 04.07.2024

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

0. Создаем таблицу для результатов.

Со следующими полями:
problem, date, time to accepted, attempts, checked tags, checked solution, learn more?
Можете скопировать нашу .

Почему именно такие поля, и как их заполнять, будет понятно дальше.

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

1. Выбираем случайную задачу.

2. Ставим таймер и начинаем решать.

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

3. Придумываем решение.

Если прошло 10 минут, и до сих пор ничего не понятно, смотрим теги (на Литкоде открываем плашку Related Topics). Должно натолкнуть на идеи. Но не открываем ее до того, как прошло 10 минут! Дайте себе подумать.

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

Если уж совсем никак, переходим сразу к 6 шагу.

4. Пишем код.

Используем веб-форму, без вашей любимой IDE. Пока не трогаем кнопку Run.

5. Тестирование.

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

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

6. Смотрим решение.

Без подписки premium на литкоде не всегда есть доступ к решению от автора, но можно смотреть discussion, там тоже есть решения.

Зачем смотреть решение, если у нас уже Accepted? Полезно рассмотреть разные варианты, если их несколько. Может какие-то проще или быстрее написать, чем ваше. Проверьте, что ваша оценка асимптотики верная. Также иногда удается заслать не самое оптимальное по асимптотике решение. Это нормально. На собеседовании тоже может быть успешным не самое оптимальное решение, если оно без ошибок. Тем не менее, в таких случаях желательно переписать ваше решение на оптимальное и перезаслать его.

7. Повторная посылка.

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

8. Заполняем таблицу.

problem: ссылка на задачу
date: дата решения
time to accepted: (мин) останавливаем таймер как только послали первый accepted. Если так и не удалось решить, ставим inf и отмечаем в learn more topic, что надо подучить
attempts: считаются все запуски кода, в том числе если не удержались от кнопки Run
checked tags: yes , если открывали плашку related topics , иначе no
checked solution: no , если первый accepted был до того, как увидели ответ, иначе yes
learn more topic: добавляем сюда всё, что надо подучить. Например, плохо идут задачи с графами, значит пишем graphs. Если в ответах упоминается DSU, а вы не знаете, что это, значит пишем DSU.

9. Рефлексия.

Каждые 10 задач стоит остановиться и проанализировать результаты.
Если в колонке checked solution более 10% задач, стоит пока остановиться, посмотреть на колонку learn more topic и поработать над пробелами: пройти релевантные курсы ( например, наш! ), почитать книги или посмотреть видео/статьи. Порешать задачи более медленно. И только потом возвращаться. Если слишком часто смотреть в ответы, то пользы не будет, нужно пытаться сокращать checked solution до нуля.

Напутствие

Здесь, как и в любом деле, важна стабильность. Лучше решать всего по одной задачке каждый день, чем "пока мне некогда, но вот когда-нибудь в будущем я сяду и решу сразу много!". Можно повесить календарь и зачеркивать крестиком каждый день, в котором была решена хотя бы одна задача. Постараться, чтобы цепь из таких крестиков не прерывалась! Через некоторое время вы заметите, что числа в колонках time to accepted и attempts уменьшаются, а checked solution стремится к нулю.

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

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

Памятка для решения каждой задачи

0. Поставить таймер (не забыть остановить после accepted)
1. Определяемся с решением и записываем O(N) по времени и по памяти.
2. Если нет идей за 10 минут, смотрим теги.
3. Если нет идей за хотя бы 30 минут, переходим к шагу 6 (если часто возникают трудности, мы с радостью поможем вам подтянуть алгоритмическую базу).
4. Пишем код.
5. Отлаживаем вручную.
6. Смотрим решения.
7. Если понравилось чужое решение, переписываем его по памяти и отправляем.
8. Заполняем таблицу.
Если количество решенных задач кратно 10:
9. Рефлексия.

Что дальше?

В дополнение к алгоритмическому интервью так же захотят оценить ваши навыки в архитектуре систем. На основе этих вопросов будет определяться ваш уровень и глубина ваших знаний. Для этого мы подготовили гайд по подготовке System Design Interview Preparation

4) Упорная работа побеждает талант…

…Когда талант не работает упорно. Мне нравится эта цитата Тима Нотке, и по моему личному опыту она идеально подходит для Leetcode. Я знаю многих фантастических и очень талантливых разработчиков, которые не могут ответить на самые средние вопросы, потому что они не знают шаблонов и правильных инструментов, не могут использовать надлежащие структуры для решения такого рода вопросов.

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

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

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

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

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

Преимущества LeetCode

Давайте кратко рассмотрим преимущества LeetCode.

Несколько языков программирования

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

Подведение итогов

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

Образовательный предлагает онлайн-курсы для таких областей, как машинное обучение, наука о данных, разработка приложений, подготовка к собеседованию и многое другое. Начните готовиться к собеседованию по кодированию сегодня с курса Educative Decode the Coding Interview. Наш курс подготовки к собеседованию помог разработчикам подготовиться к собеседованию с ведущими технологическими компаниями, такими как Netflix, Facebook, Microsoft, Amazon и Google.

1) Важность структур данных и алгоритмов

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

Давайте будем честными, прочная основа в структурах и данных важна для каждого разработчика. Я недавно столкнулся с историей о том, как простое улучшение алгоритма позволило сократить время загрузки для GTA V на 70%, и я по опыту знаю, как эффективная реализация может обеспечить бесперебойную работу приложения даже под нагрузкой.

Топ 8 лучших ресурсов для практики программирования в 2018

Привет, Хабр! Представляю вашему вниманию перевод статьи Top Coding Challenge Websites of 2018 автора Trey Huffine.

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

На чем бы вы не кодили: Python, Ruby, JavaScript, Golang, TypeScript, или еще какой-то язык, вы найдете здесь ресурс под ваши потребности. Чтобы научиться программировать — нужно программировать.

Альтернативные способы приготовления

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

Проекты

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

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

Совет: вклад в открытый исходный код тоже велик! Открытый исходный код оценивается очень высоко. Такая работа позволяет вам внести свой вклад в нечто гораздо большее, чем вы сами.

Стажировки

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

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

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

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

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

Недостатки LeetCode

Это просто код

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

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

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

  • Сочувствие
  • Умение слушать
  • Командная работа
  • Эффективное общение
  • Стремление учиться
  • И т.п.

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

Это платно

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

Запоминание или длительное обучение

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

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

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

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

Мои собеседования 2021 edition

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

Глоссарий

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

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

CV - резюме

leetcode easy - задачи, которые должен уметь решать каждый программист

leetcode medium - задачки сложнее, без подготовки решить которые может быть сложно

leetcode hard - сложные задачи, требуют предварительной подготовки

простой system design - придумай архитектуру системы

классический system design - придумай архитектуру системы, но так, чтобы она работала под нагрузкой

follow-up - когда текущая задача изменяется в сторону усложнения

DP - динамическое программирование

О себе

Опыт 10+ лет в бэкенде, небольшой опыт управления, стек самый разнообразный: от ruby до clojure. Интересующие позиции: синьор+, строго бэкенд, строго не блокчейн и не node.js/php.

Почему собеседуюсь: проверить свой уровень, если будет что-то интересное, то готов перейти. Текущая компенсация устраивает, и переходить в другую компанию я готов только на бОльшую з/п.

Сам подал CV только в Сloudflare, но получил отказ. Очень надеюсь, что из-за миграционного статуса.

Компания по доставке еды

Известна тем, что платит сильно меньше рынка. Связались на прямую в linkedin, предложили менеджерскую позицию, но я отказался. Узнав финансовые ожидания, подумали и решили провести пару раундов.

Первый раунд был очень простым кодингом (leetcode easy).

Второй раунд был простым system design: придумать схему данных и какие эндпойнты использовать для решения конкретной задачи + обсудили пару подводных камней.

Третье интервью было с нанимающим менеджером, просто поговорили за жизнь. Задачи команды показались мне неинтересными.

Через неделю пришел отказ без объяснения причин. Через третьих лиц удалось узнать, что причиной стало "не соответствие опыта и запрашиваемой з/п". Один из собеседующих позже подтвердил, что технически все ок, значит дело было в менеджерском раунде или размере запрашиваемой з/п.

завалить можно не только техническую секцию

детального фидбека в случае отказа добиться очень тяжело

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

Компания по бизнес процессам

В linkedin со мной связался сторонний рекрутер. Данную компанию я знал, и мне было бы интересно поработать в ней.

Первое собеседование было чисто по ruby. Это мое первое собеседование на знание конкретного языка за последние 5 лет точно: proc vs lambda, prepend vs include и так далее (рубисты поймут). Далее были вопрос про oauth, ssl и одна интересная задачка, не связанная с кодингом, которую я решил. Ответил по ощущениям процентов на 80%, это собеседование было полезным, нашел пару пробелов в знаниях.

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

Третий раунд был с топ менеджером на поболтать + задача на LRU кеш (leetcode medium).

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

Рекрутер мне обещал оффер "вот-вот", но просил подождать (а я и не торопился). Через месяц пришел отказ без объяснения причин. Мне казалось, что все шло хорошо, и что я сделал так не знаю до сих пор.

отказ может придти, даже когда его не ждешь

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

В первом раунде два человека спрашивали по всему от big-oh до многопоточного программирования:

что такое REST и unicode

как бы ты закодил X

что такое big-oh

процесс vs поток

Ответил на 90% вопросов.

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

В третьем раунде было исправление ошибок в виде парного программирования + новые фичи. Самым сложным из ошибок для меня были интеграционные тесты: никак не мог заставить работать руби с входными потоками ввода и вывода (гуглить было можно). Убил 20 минут, но все-таки сделал. Оказалось, что для follow-up задач моя архитектура совершенно не подходит, я наговнокодил (именно так) одну задачу, но ни я, ни собеседующие, не были в восторге от результата.

Как итог желаемую з/п мне предложить не смогли, поэтому разошлись.

ООП дизайн не мой конек

функциональщина one love

Stripe

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

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

Первая сессия была алгокодинг, с какой-то простой задачей (чуть слабее medium)

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

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

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

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

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

Первый этап был созвон с CTO, поболтали за жизнь.

Вторым этапом шло тестовое задание на node.js, которого я не знаю. После переговоров мне было разрешено делать на golang. Пришлось реализовывать не только само задание, но и болванку, так как оригинальная болванка была все на той же ноде. Кроме того, в требованиях было настроить прекоммит-хуки и малоизвестный лоад-тестер, оба эти требования мне показались странными.

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

Интернет-магазин

Бомбардировали мой linkedin давно, но все время было не до них.

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

Третий этап был менеджерский, и тут с английским было все хорошо, менеджер пошел по моему резюме и сходу задал три релевантных вопроса, на которые я дал неправильный ответ. Интервью прервалось через 30 минут после начала. Я был в шоке, было ощущение, что я ничего не знаю и вообще пора в джуны. Один из вопросов был: является ли редис однопоточным и я ответил неверно, второй был про сборщик мусора в питоне, (я писал на питоне 3 спарк джобы и только поэтому его упомянул, этот вопрос был помимо упомянутых трех, и я не считаю его релевантным). Мне было стыдно, но провалы случаются, надо двигаться дальше. Все свои ошибки я учел.

никогда не поздно свершиться epic fail-у

если с чем-то ты работал вскользь - стоит об этом упомянуть или вообще не показывать в CV

Барахолка

Компания написала мне в linkedin, позиция звучала как "principal engineer". Мы созвонились с рекрутером в пятницу, он обещал мне выдать тестовое задание буквально через пару часов, и я должен был его сделать за выходные.

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

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

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

Через пару дней пришел ожидаемый отказ.

Выводов из этой истории я не сделал

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

На первой сессии было две задачи: rain drop и на технику scan line. С первой я просидел почти час, почему-то она мне давалась с трудом, а вторую решил за 15 минут. Был получен позитивный фидбек.

На второй сессии два человека гоняли меня по всему - от флагов в chmod до оценки памяти в merge сорт. Было все: и как найти процесс по порту, и как решить задачу на анаграмму. Куча вопросов, на все я ответил только по алгоритмам, остальные с переменным успехом. Аналогичный раунд повторился еще 3 раза (решили проверить на мне весь банк вопросов видимо)! Вопросы были разные, правда по chmod повторился, и тут я уже был готов. Одна сессия была про дебаг упавшего приложения (не работает сервис, что делать?) мне понравилось, подобные секции отлично показывают твой опыт. Один из вопросов, на который я не ответил, звучал так: "система выдает ошибку "нет места", хотя место есть, как такое может быть?". Больше всего мне не понравился вопрос "чем отличается абстрактная фабрика от обычной". Почему-то подобные вопросы вгоняют меня в уныние. Я старался экономить время интервьюверов и на подобные вещи сразу отвечал "no idea". Вот некоторые вопросы, с которыми я столкнулся:

could you explain /proc structure

heap sort vs normal sort

is it possible to have more than one A-record

what're json pitfalls

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

Последним раундом было собеседование в команду SRE, которое остановилось после моей фразы "я не SRE" (20 минут, рекорд).

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

ByteDance (tiktok)

Они и сейчас продолжают бомбардировать linkedin. Со мной связалась сторонний рекрутер.

Вторая секция была на классический system design: url-shortener.

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

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

Четвертая секция (назовем это так) была разговором с менеджером другой команды - общие вопросы и простая задача. Здесь был очень странный момент с вопросом про модель конкурентности в go (какая-то аббревиатура, но не CSP), на что я рассказал то, что знал: про n:m мэппинг горутинг в треды, паркинг горутин при I/O, CSP, но видимо это было не то, что ожидал рекрутер. Я очень негативно отношусь к подобным специфичным вопросам.

Через неделю пришел отказ без объяснения причин.

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

Indeed

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

пятую не помню. Очевидно, что я выбрал две последних. Ничего интересного не было, стандартные thread vs process и дебаг упавшего приложения.

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

Онсайт в данной компании проводится строго по средам, 5 этапов + вводный и заключительный от главы подразделения в данной стране. Первая неприятность случилась уже на вводном этапе - на зум колле было 4 кандидата, включая меня, и все кандидаты увидели друг друга, как по мне компания пренебрегает приватностью. Это не было озвучено заранее, иначе я бы не включал камеру и изменил бы имя. На заключительном этапе я дал на это фидбек (его просили), и лид офиса встретил мои комментарии полным непониманием. "В таком случае мне пришлось бы тратить час по 15 минут на каждого" утром и вечером. Что ж.

Вторая секция была на ревью онлайн PR. Была взята реальная функциональность с сайта компании и код, который ее реализует. Язык нужно было выбрать заранее, список такой: Python, Java, C++, Javascript, Go. Go добавили буквально месяц назад, так что считаю, что мне повезло, с остальными у меня нет опыта написания "веб-штук". Размер PR-а был небольшим, и тебе дается 30 минут, чтобы отметить все, что тебе не нравится. Я нашел два бага, пару неточностей, предложил как улучшить алгоритмическую сложность в паре мест и попросил добавить тесты. Тут скорее всего я не обратил внимание на очень важную вещь - сервис был не durable, то есть все данные хранились в памяти, и абсолютно точно нужно было об этом указать. Но я даже об этом не подумал, и осознание пришло уже вечером. Я не был готов к этому заданию, в следующий раз буду.

Секция system design была стандартной, но мы очень долго обсуждали как сделать пагинацию, и мне кажется интервьювер меня так и не понял. Я совершил ошибку, предложив сделать пагинацию не page/perPage, а after=timestamp, там всплыло пару подводных камней.

Вторая алго-секция начиналась с классической задачи на рейт-лимитинг. Кодинг занял очень мало времени, но вот с оценкой я напортачил, тут она O(1) amortized. Так как задачу я решил быстро, было решено обсудить аналогичную задачу только на плавающую медиану (leetcode hard). Я объяснил свое решение и оценку и закодил. Интервьювер остался доволен.

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

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

Компания из фаанг

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

Первый раунд был с нанимающим менеджером. Была простенькая задачка на поиск по категориям и вопросы по tcp/ip.

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

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

Тут не пришел даже отказ, вспомнился этот анекдот:

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

Начинаю подозревать, что они взяли кого-то другого.

Электронный банк

Со мной связался сторонний рекрутер в linkedin.

Первым этапом были две простые задачи на hackerrank-е (или codility, не помню). Я получил 100 из 100.

что такое докер?

как бы ты сделал авторизацию для веб приложения

как избегать проблем с at least once delivery

Была задачка на Go, решенная на 70%. Второй раунд был с менеджером, который спросил про SOLID и дал задачку на бинарный поиск. Закончили за 30 минут. Через 2 недели был фидбек "выбрали другого кандидата". Именно тут, как мне кажется, сыграл вопрос денег и тот факт, что у меня уже был оффер от другой компании, который я должен был подписать за два дня.

Еще было примерно 5-10 компаний, которые прекращали общения после озвучивания ожиданий от з/п, ни одна не написала "слишком много для нас".

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

Из всех перечисленных компаний, еще раз я бы хотел попробовать попасть только в Stripe.

Выводы и мысли вслух

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

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

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

linkedin обязателен если планируешь работать вне России.

Glassdoor дает хорошее представление о том, какие вопросы и задачи вас ожидают на собеседовании.

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

LeetCode - лучший способ подготовиться к собеседованию

Изучение

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

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

Заключение

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

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

Спасибо, что дочитали до сих пор, не стесняйтесь связываться со мной в Linkedin.

2) Всегда есть кто-то более знающий, чем вы

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

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

5 вещей, которые я узнал после решения более 500 задач на Leetcode

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

6 месяцев назад


Любой, кто ищет работу в сфере разработки программного обеспечения, вероятно, очень хорошо знает Leetcode. На сайте собраны задачи и решения, которые задают в ходе технических собеседований в некоторых самых крупных компаниях, таких как Google, Facebook и Microsoft.

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

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

Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.

— Max Howell (@mxcl) June 10, 2015

Что такое LeetCode?

Проблемы сосредоточены на алгоритмах и структурах данных. Вот несколько примеров проблем, которые вы можете найти на LeetCode:

  • Анаграммы
  • Дерево двоичного поиска (BST)
  • Обход порядка уровней
  • Связанные списки
  • Самая длинная подстрока без повторяющихся символов
  • Палиндромы
  • Сумма пути
  • Две суммы
  • Сортированные массивы
  • Сортированные списки
  • Подпоследовательности
  • Допустимые скобки
  • 2D матрица

Читайте также: