Здесь я должен признать, что я один из тех, кто любит задавать алгоритмические вопросы в интервью, но я должен подчеркнуть, что фактический ответ на вопрос абсолютно не имеет значения. Меня не волнует, знает ли собеседник ответ или нет. Вместо этого, для меня этот вопрос нацелен на различные аспекты, такие как следующие - в порядке важности:
Требования
Такие вопросы намеренно занижены. В вашем примере нет дополнительной информации о последовательности. Если у вас есть собеседник, который спрашивает вас, действительно ли эти цифры отсортированы, это хороший знак. У него есть правильное мышление, чтобы спросить клиентов о более подробной информации, которая поможет прийти к лучшему решению в более короткие сроки. Кандидат также может поиграть с идеей использования пространства O (n) для хранения массива из N чисел, но он не должен этого делать, не спрашивая более подробную информацию о X и Y. Предположим, что X и Y находятся между 1 и 1000 тогда, конечно, продолжайте и запустите решение на основе массива. Но если я скажу вам, что интервал составляет 1 и 1 миллиард, то проблема становится совершенно другой. Позвольте мне еще раз подчеркнуть, что меня не волнует решение.
Стандартные методы
Я не хочу нанимать программиста, который даже не знает, что означает O (n). Это абсолютно необходимо знать, если у вас было достойное образование в этой области. Но также важно не просто знать, что это значит, но и применять эти знания. В вашем примере я хочу, чтобы кандидат осознал, что ему не разрешается сортировать данные (не задавая дополнительных вопросов, касающихся опции сортировки по группам или других подходов сортировки O (n)), поскольку требуется сортировка O (n log n) в целом.
Точно так же другие вопросы алгоритма нацелены на стандартные методы, такие как обход дерева или графа или рекурсия. Кандидат может воспользоваться одним из этих методов, который не производит хорошего впечатления. В таких случаях, однако, мне нравится копать глубже, чтобы выяснить, есть ли у кандидата какой-либо опыт в CS. Конечно, это зависит от целевой позиции, но обычно разработчик, который не знает ни о сложностях времени выполнения, ни о типичных структурах данных и их обходах, не поможет.
Проблемное мышление
Задав вопрос, вы внимательно следите за кандидатом. Как он / она реагирует? Здесь вы получите лучшие результаты от кандидатов, которые не имеют ни малейшего понятия о том, как сначала решить проблему . В этом отношении вопрос проверяет, что может произойти, если аналогичная ситуация возникнет на рабочем месте позже. Вы можете столкнуться с такой проблемой во время своего развития, и было бы хорошо узнать, как ваш кандидат справляется с этими проблемами, даже если он / она не может решить все это самостоятельно.
Пример: вы не хотите, чтобы ваш кандидат перешел в беззвучный режим на следующие полчаса! Проверьте, может ли он придумать разумные вопросы (см. Требования), проверьте, начинает ли он мыслить нестандартно, как только осознает, что не может этого сделать. Даже «забавный» встречный вопрос типа «Могу ли я использовать опцию« телефонный сотрудник »?» хороший знак
Как ответить
В общем, лучшие ответы, которые вы можете дать на подобные вопросы, это контр вопросы! Сразу же ответить на вопрос в целом не удастся, и на самом деле это вообще не очень хороший ответ, потому что все эти вопросы намекают на компромиссы, которые подразумевает ваш ответ, и при этом у вас нет необходимой информации, которая еще не была бы разумной. компромисс. Конечно, качество встречных вопросов варьируется между кандидатами.
Как общее примечание по вопросам собеседования: встречные вопросы редко бывают плохими. В одном из моих собственных интервью меня, например, спросили что-то вроде следующего: «Если бы вам пришлось реализовать X, вы бы выбрали для этого C ++ или Java и почему?» - Я просто возразил: «Я ограничен этими двумя?». Подумайте сами, какую реакцию вы получаете от интервьюера на такой встречный вопрос - и насколько легко вам действительно показать интервьюеру, на что вы способны.
find the missing element in O(N) or better
что значит "или лучше" в этом контексте? Кажется, что такая вещь может быть решена с помощью простого цикла while, но в любом случае я не понимаю - это или решено, или не решено , верно?