Как решать алгоритмические секции: помощь разработчикам, собеседующимся в Яндекс. Часть 1

Автор Ivan Samoilov
Как решать алгоритмические секции: помощь разработчикам, собеседующимся в Яндекс. Часть 1

Всем привет.

Меня зовут. Лёша шаграев я руковожу службы разработки в. Яндекс поиске сегодня мы поговорим о том как разработчик может попасть на работу в.

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

Это не самое сложное. Что за навыки она еще проверяет. Почему они и как — это проявляется на самом интервью об этом сейчас и поговорим по детекции необходимо будет решить несколько алгоритмических задач и работа по каждой из них происходит по одному и тому же в начале формулируется условия задачи затем кандидат должен придумать алгоритм который позволяет решить и в конце концов написать код реализующие придуманный алгоритм кот можно писать на бумажке при помощи ручки и на маркерной доске при помощи маркера. Восход пишется от руки мы не требуем доскональное знание всех сигнатура всех методов. Но конечно же вы должны хорошо понимать какие именно методы вы используете и каких вычислительных ресурсов требует фронтовой если отдельно не обговаривается. Вы можете использовать более-менее любой язык программирования например сегодня для демонстрации наши задачи я буду использовать язык Python для примера ход решения следующей задачи дано бинарный. Вектор необходимо. Определить максимальную длину последовательности из подряд идущих единиц в этом векторе когда условия сформулирована кандидата. Есть несколько вариантов как начинать твои действия например он может сходу начать писать какой-то кот или придумывать алгоритму. Я был в такой ситуации рекомендовано часть каких-то тестовых примеров для того чтобы проверить, что условия задачи понятой верно. И чего не упущено уже потому. Какие тестовые примеры смог написать кандидат можно много о нём понять вот скажем в данном случае тестовый пример всего лишь один и на самом деле он мало. Что проверяет мне хотелось бы увидеть больше покрытие разных вариантов вот скажем массив состоящий из одних единиц и задних налей массив в котором искомое заканчивает наш массив или на пустой входной массив все эти примеры стоило бы добавить чтобы понять, что условия действительно. Планета правильно. Давайте Добавим их сейчас когда написана достаточное количество тестов мы уже с какой-то степени уверенности можем говорить о том что. Понято верно и мы рассмотрели какое-то количество чаевых ситуаций и не забудемо них после этого наступает время для того чтобы сформулировать алгоритм участия в данном случае задача сложная и алгоритм тоже получится достаточно простой мы будем итерироваться по элементам массива слева направо встречай единицу мы будем увеличивать счетчик длины последовательности из длин всех в следующей последовательности и мы выберем максимальную. Давайте попробуем написать этот код вот сейчас я столкнулся со свойствами такой поверхности для написания кода как доска. Посмотрите Я сходу захотел написать по элементам массива я сразу бросился — это делать, но в процессе. Я понял, что мне ещё необходимо хранить текущую длину способности из единиц мне — это максимум для того чтобы обновлять. И для этого нужны перемены заранее объявить я этого не сделала поэтому сейчас мне придётся стереть часть из того, что я написал, тогда как на компьютере я бы просто взяла вещи кусок кода в нужное место. Поэтому нужно заранее продумывать тот алгоритм который мы хотим написать с тем чтобы не приходилось такого делать, что ж. Давайте всё исправим думаю многие программисты сталкивались с тем, что не так уж и просто превратить в правильную и алгоритмов корректно работающий код в данном случае — это не удалось и мне легко видишь, что — это переменная например никогда не уменьшается, что странно если кандидат допустил такого рода ошибку носом её нашёл исправил. Это хорошо конечно же в идеале. Нужно ошибки в принципе не допускать написание кода. Но сейчас там это, тогда нам не остается ничего кроме как их исправлять. Давайте же я сейчас попытаюсь — это сделать сейчас я решил обновлять текущее значение максимума только когда встречаю в исходном массиве из-за этого я допустил другое ошибку, а именно я не как не обрабатываю последнюю из последовательностей единицы если массив заканчиваются на единицу среди моих часов есть сразу два которые позволят мне — это понять, что же я знаю как с этим справиться сейчас я исправлю ошибку наконец мне удалось написать абсолютно корректный код, но вы можете обратить внимание на то, что в нём есть некоторые недостатки например мы можем увидеть дублирование кода и мы можем увидеть отдельно обработку специального случая последний последовательность из единиц в целом. Хорошо было бы этих двух недостатков. Хотя они конечно являются критичными. Давайте попробуем написать код который этим недостатками обладает не будет. Вот теперь нам удалось создать кот который является некорректным и компактным в нём минимальное количество исключительных ситуаций и совсем нет дублирование кода — это очень кстати имеет смысл поговорить об обработке каких-то кривых случаев. Многие считают, что очень хорошая идея начать писать код с того чтобы обработать случай входного массива или массива состоящего только из нулей и единиц или ещё каких-то особых ситуаций — это не всегда так иногда — это необходимо, но часто — это приводит к тому возникает какие-то неожиданный варианты на которые потом очень хочется опереться и — это приводит к излишнему усложнением и как следствие к ошибкам. Давайте посмотрим, что бы было если бы я решил заранее. Рассмотрите ситуации пустого входного массива.

0 комментариев
0

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