Всем привет!
Я Алёна, Android разработчик. В последнее время активно проходила собеседования, в том числе алгоритмические.
В этой статье поделюсь своим опытом, как они проходят, какие есть подводные камни и нюансы.

Алгоритмы - пожалуй, самый сложный и холиварный этап собеседования, код приходится писать под контролем интервьюера, нужно учесть все нюансы и оставаться спокойным.
Главная сложность на алго собесе - ограниченное время. Обычно даётся 30 минут, из которых первые 5 - рассказ о себе, последние 5 - вопросы интервьюеру. То есть надо ориентироваться на 20 минут, чтобы за это время прочитать задачу, написать и проверить решение, ответить на вопросы. Перелимит даже 5 минут, увы, отмечают (
Первый шаг - внимательно и спокойно прочитать условие, чтобы «узнать» задачу. Как вы мгновенно узнаёте знакомого человека вне зависимости от одежды, здесь нужно отгадать алгоритм, который хотят от вас увидеть, вне зависимости от «обёртки» конкретной задачи. Для этого нужно набить руку и прорешать достаточно задач, чтобы находить для них нужный алгоритм быстро.
Всего возможных алгоритмов не так много, как правило, rocket science не дают. Джентельменский набор - два указателя, рекурсивный обход дерева, алгоритмы с хэш мапой, работа со строками.
Следующий шаг - проговорить решение вслух. Это важно сделать прежде, чем приступать к написанию кода. Большая ошибка - начинать писать код, не увидев в голове чёткого решения, и придумывать решение на ходу. Именно поэтому важна практика, нарешать как можно больше задач до собеседования.
Писать код обычно предлагают в Yandex Code, где нет автодополнения, подсветка синтаксиса очень условная, не выделяются ошибки. И это тоже может быть трудно, так что старайтесь писать код в таких песочницах, а потом можно запустить его в IDE и проверить.

Перед тем, как писать решение, ещё важно продумать краевые случаи для задачи. Много времени на это тратить не стоит, напишите их в комментарии перед кодом, к реализации можно вернуться позже.
Про краевые случаи есть хорошее видео Михаила Густокашина
Если кратко, стоит посмотреть на такие краевые случаи:
Пустой массив или строка
Массив с одним элементом
Отрицательные элементы в массиве
Итерации в начале и в конце массива (моё любимое, не забудьте проверить, где находится указатель в конце цикла, возможно, придётся сделать ещё одну итерацию)
Писать код нужно, параллельно комментируя, и это тоже сложно, в обычной жизни мы пишем код молча, придётся потренироваться. Можно поступить так: написать строчку - прокомментировать, написать ещё одну - объяснить, и т. д.
Мы написали код, и сейчас самый ответственный момент - прогнать основные и краевые кейсы, убедиться, что наш код работает правильно во всех случаях. Обычно набор тестовых входных данных пишут в условии задачи. Как компилятор, внимательно прогоните код на тестовых примерах, результат промежуточных итераций можно писать рядом в комментариях. Большая вероятность, что здесь всплывут неучтённые моменты, самое время их исправить в коде.
Теперь вы полностью уверены в своём решении. Интервьюер задаст вопрос о сложности алгоритма. Как правило, это самая лёгкая часть, т. к. алгоритмы обычно попадаются линейной, квадратичной или логарифмической сложности. Могут помимо сложности по времени спросить про сложность по памяти.
Резюмируя, ключ к алгоритмической секции - насмотренность. Нет другого пути, кроме как решать много easy и medium leetcode и yandex.coderun задач, чтобы знать их в лицо. Лучше решать их с таймером, в среде без автодополнения, параллельно комментируя. Вы уменьшите волнение и влияние жёстких условий собеса, если будете к ним готовы.
Верьте в себя, и у вас всё получится!
Больше о мобильной разработке и других полезностях в моём ТГ
