Как решать задачи на собеседованиях
При решении задач на собеседовании кандидаты часто волнуются и упускают из вида полезные мелочи, которые могут помочь в понимании задачи, разработке решения или в поиске ошибок. Чек-листы и советы из этой статьи помогут сосредоточиться на нужных деталях.
Понимание задачи
Внимательно прочитать условие.
Понять что дано, а что требуется?
Какие данные есть в задаче и каких типов (входные данные)?
Какой результат нужен и какого типа (выходные данные)?
Какие действия описаны в задаче?
Разработка решения
Если после прочтения задачи нет четкого представления как решать, сложно сосредоточиться, много мыслей перебивают друг друга, то начните записывать — в коде в комментариях набрасывать план действий или конспектировать мысли, чтобы они больше не крутились в голове. Кому‑то может быть удобнее визуализировать задачу или решение. Для этого держите рядом листок с ручкой или карандашом, чтобы сделать набросок в моменте.
Две вещи, на которых лучше сосредоточиться: всегда есть данные и всегда есть действия над ними. Нужно уметь выделить данные и понять, какие действия нужно над ними совершить. Сложность в том, что действия тоже могут являться данными. Например, задача вызвать функции в определенном порядке. Данные в этой задаче — это функции, а действия — это организовать функции в определенном порядке и вызвать их.
Определить данные
Для лучшего представления решения, поможет формулирование условия другими словами. Если не понятна фраза «перебрать список», то попробовать подобрать синоним, например, «пройтись по массиву», возможно после этого появятся идеи, как написать код.
Бывают синонимы действий: перебрать массив, пройтись по списку, преобразовать набор данных и т. д. И бывают синонимы данных: массив, набор, список, очередь, куча, объект и т. д. Нужно понять какой тип данных из языка понадобится для представления этих данных.
Простые типы данных, например, числа и строки есть почти в каждом языке и обычно понятно как их представить в коде и как преобразовывать. Можно создать переменную с числом и совершать с ней математические операции.
Но сложные типы или составные данные бывают по разному представлены в разных языках.
В JS есть массив и объект, а связанный список можно реализовать как на основе массива, так и на основе объекта, и в зависимости от этого понадобятся разные действия чтобы пройтись по списку.
Определить действия
Четкое понимание типа данных помогает определить, какие действия понадобятся для преобразования этих данных.
В JS по массиву можно пройтись с помощью циклов или встроенных в массив методов, по объекту можно пройтись с помощью цикла for...in
, но иногда удобнее сначала преобразовать его в массив. Почти любое преобразование данных в массиве можно сделать с помощью map
, filter
или reduce
, если вы хорошо их понимаете и нет особых требований по производительности. В ином случае используйте известные вам методы и конструкции.
Действия или функции можно разделить на два типа:
Функции‑преобразователи: принимают данные, обрабатывают их и возвращают результат. Данные могут быть любого типа, включая другие функции.
Функции‑действия: выполняют определенные действия, такие как вызов других функций по определенной логике, могут ничего не возвращать.
Полезные вопросы:
Что должна делать функция? Преобразовать данные или выполнить действия?
Есть ли повторяющиеся действия?
Что лучше подойдет для повторяющихся действий: цикл или рекурсия?
Отладка решения
По опыту проведения собеседований, больше волнения возникает на этом этапе. Когда кандидат написал, как ему казалось, рабочее решение, но получил ошибку или некорректный результат. Кто‑то в такие моменты впадает в ступор, кто‑то начинает действовать методом тыка и еще дальше уходит от правильного решения. Чтобы не терять время и не запутать себя, предлагаю следующий план.
В случае ошибки нужно внимательно прочитать сообщение об ошибке, если оно доступно. Иначе:
Проверить синтаксис:
скобки,
точки, запятые,
названия методов и переменных.
Проверить аргументы функции, что должна принимать функция и что она по факту принимает (что дано):
количество аргументов,
типы аргументов,
как достаются аргументы при объявлении функции (используется ли рест оператор, используется ли ключевое слово arguments),
как передаются аргументы при вызове функции (используется ли спред оператор, были ли аргументы проброшены через bind, call или apply).
Проверить что должна возвращать функция и что она по факту возвращает (что требуется):
Проверить что делает функция (что требуется):
какие данные есть и какие у них типы,
какие преобразования с ними происходят,
правильная ли последовательность операций и вызовов функций,
какие логические операторы используются,
используется ли в функции контекст, нужно ли его подменить?
Заключение
Сохраните себе чек-листы и советы, которые показались полезными, поправьте под свой язык, добавьте свои пункты и подсматривайте в них на собеседовании, чтобы не дать волнению скрыть ваши реальные знания и опыт.
Поделитесь вашими лайфхаками, чек-листами и советами в комментариях.
Буду рад любой обратной связи.