Как гласит заголовок, какая ваша любимая проблема с собеседованием на доске и почему она оказалась для вас эффективной?
Младший, старший, Java, C, Javascript, PHP, SQL, псевдокод и т. Д.
interview
algorithms
NickC
источник
источник
Ответы:
Я прошу кандидата разработать решение проблемы, с которой я действительно столкнулся в своей повседневной работе. Поступая так, я пытаюсь создать диалог между мной и кандидатом. Я пытаюсь обсудить дизайн, который он строит, как будто я никогда не думал о проблеме раньше.
Я пытаюсь оценить, можем ли мы понять друг друга и можем ли мы говорить о технической проблеме без путаницы.
Конкретный пример
(Для рабочего стола Java разработчик)
Разработайте API для обработки истории навигации веб-браузера (предыдущая страница, следующая страница, перечислите 10 предыдущих страниц), и это может быть многократно использовано во многих частях приложения (здесь я привожу конкретные примеры в нашем приложении). Затем набросайте реализацию.
Мне нравится этот, потому что он достаточно прост, его легко проиллюстрировать, его можно решить шаг за шагом (добавить дополнительное поведение, не нарушая все), он позволяет говорить о крайних случаях и обработке ошибок, а также позволяет говорить о данных структур.
источник
Я нашел это чрезвычайно интересным, когда брал интервью у кандидатов и отсеивал тех, у кого там не было бизнеса. По сложности он похож на Fizz Buzz, но фокусируется на навыках работы с базами данных.
Я позволил им написать это в любом варианте SQL, который они хотят, и не слишком требователен к незначительным синтаксическим проблемам. В основном я хочу знать, что они понимают основные понятия реляционных БД.
Большинство кандидатов могут пройти часть 3 без каких-либо проблем. Вы будете удивлены, как многие думают, что ответ на часть 4 состоит в том, чтобы просто изменить оператор с ИЛИ на И в предложении где.
источник
«Нарисуй для меня на доске дизайн последнего проекта, над которым ты работал, не раскрывая мне никаких чувствительных деталей».
источник
Реализовать
strcpy
,strcmp
и друзья.источник
atoi()
.strdup()
.strrev()
или перевернуть строку. Мое решение для белой доски произвело на них впечатление, и сейчас я делаю работу.Мой фаворит, который охватывает несколько дисциплин, состоит в том, чтобы подсчитать количество узлов в двоичном дереве с учетом интерфейса (в C #):
и просто для удовольствия, вот реализация, хотя интервьюируемый не должен видеть это.
и помощник класса:
Решение, которое мне нравится видеть, состоит в следующем:
Как это демонстрирует знание:
источник
Два вопроса, которые вызвали для меня интересные дискуссии на доске:
Они начинаются с простого, а затем становятся все более сложными.
источник
Я не люблю использовать головоломку или вопрос дизайна в качестве вопроса доски. Я предпочитаю простые, простые вопросы, которые проверяют способность кандидата написать некоторый код. Мои любимые:
1) Напишите функцию, чтобы перевернуть односвязный список. (Требуется некоторое время, прежде чем они поймут, что им нужно 3 указателя.)
2) Для заданного двоичного дерева найдите глубину двоичного дерева. (Этот вопрос проверяет их способность писать рекурсивный код. Позвольте мне проверить, не поврежден ли их базовый случай.)
3) Напишите процедуру для двоичного поиска в массиве целых чисел. (Как говорит Джон Бентли (в Programming Pearls), многие люди, как правило, допускают ошибки при написании бинарного поиска. Затем можно найти ошибки, написать контрольные примеры, выполнить код и т. Д.)
источник
Мы использовали это в одной компании, в которой я работал.
Мы передали кандидату лист бумаги, используемый для отслеживания времени. Это было реальное расписание, используемое одним или нашими подразделениями. Мы попросили кандидата провести нас через процесс проектирования для создания лучшего инструмента отслеживания времени. Никаких границ, не говорил, на каком языке и т. Д., Просто хочу посмотреть, насколько хорош кандидат на «полном жизненном цикле». Это дало нам реальное представление о том, как они собирали требования. Как они структурировали таблицы базы данных, какой интерфейс они могли бы делать. Навыки общения, очевидно, были необходимы для этой задачи. Обычно это делалось в комнате с несколькими большими белыми досками и длилось до 2 часов.
Мы наняли несколько человек, использующих этот процесс, и если они действительно хорошо справились с поставленной задачей, они очень хорошо для нас. Если они были маргинальными, и мы все равно решили их нанять (отдельная тема), то они были маргинальными программистами.
источник
Я использую проблему, которая имеет отношение к моей области программирования.
Если я разрабатываю веб-приложения, я хочу посмотреть, как они могут составить веб-форму, которая удаляет записи, и какой подход они могут использовать, например, для удаления записи из базы данных. Это говорит мне, знают ли они базовые принципы базы данных, как они взаимодействуют с пользователем для проверки удаления, и знают ли они, что такое мягкое удаление.
У меня нет любимой. Задача, которую я выберу, сильно зависит от работы.
Мне все равно, смогут ли они решить проблему полностью или нет в ходе собеседования, какие технологии и языки они используют, или насколько дрянно выглядит их код на доске. Я ищу образец мысли; Я хочу посмотреть, знают ли они, как продумывать и решать проблемы.
источник
Моим любимым был мой друг.
Это работает хорошо, потому что:
Это алгоритмический вопрос, поэтому требуется, чтобы собеседник уметь думать, а затем объяснять свое мышление, чтобы вы могли видеть, как работает его мозг.
Это не зависит от языка.
Вряд ли кто-то понимает это правильно (обычно это крайний случай, который они пропускают (обычно 1 или 2)), или они не обрабатывают отрицательные числа, поэтому вы можете увидеть, как они обрабатывают ошибки, и им говорят, что они ошибаются.
Большинство делают это как простое, но очень медленное сито (например, 80% людей проверят n как простое число, разделив n на все целые числа меньше n), что дает вам много возможностей для разговоров о том, как они могли бы улучшить алгоритм на основе о пространственно-временных компромиссах, например, «почему вы делите число на 4, если вы уже знаете, что оно не делится на 2?» или «Вы выяснили, что вам нужно только делить на все простые числа меньше, чем sqrt (n), но для этого требуется, чтобы вы где-то хранили эти числа, каковы последствия этого?»)
Там нет необходимости для них, чтобы получить правильный ответ. Если кто-то может подумать и объяснить свое мышление, то ему предстоит долгий путь, чтобы стать хорошим кандидатом.
источник
Что-то под названием aff_z, которое было частью экзаменов C моей инженерной школы и использовалось в качестве «фиктивного» теста, чтобы ученики не смогли при возвращении из отпуска (наша система маркировки подразумевала, что провал теста остановил маркировку, поэтому провал этого фиктивного теста лишить законной силы весь ваш тест. Заставляет вас обратить внимание на идиотские детали). Я использовал его один или два раза во время интервью.
В любом случае ... Я забыл точную формулировку, но это было что-то вроде этого ...
Грустная вещь состоит в том, что не только некоторые студенты придумают чрезвычайно запутанные решения, когда ответ достаточно очевиден, но что некоторым даже удастся потерпеть неудачу.
И, верьте или нет, это происходило и во время интервью.
Запускать это на собеседованиях было довольно весело, так как некоторые заявители начинали писать возможные ветки и потом понимали, что не так (очевидно, если вы спрашиваете их только устно, вполне понятно, что они делают это так, как вы говорите ... но если вы дать в письменном виде, я нахожу это озадачивающим ...)
Это глупо, но я предполагаю, что это минималистичный скрининг (аналогично, когда я нанимаю программистов на JS, я всегда спрашиваю, как объявить переменную, а затем, в зависимости от их ответа, имеет ли вообще какое-либо значение использование var. Довольно часто печальный момент, честно говоря.)
источник
variablename = variablevalue;
», тогда как хорошие просто смеялись по телефону или лично и прямо говорили мне, что будет с другим или без него.var
).Это действительно зависит от того, что вы ищете. Как организация, которая выполняет большую динамическую работу в сети с изображениями, я склонен задавать вопрос о геометрии, относящийся к работе. В любом случае, я склонен задавать геометрический вопрос, так как считаю это хорошим тестом по математике, который приятен и нагляден и может показать кандидатам способность визуально представить свою работу и методично проработать задачу.
Для продвинутых кандидатов я иногда задаю следующий вопрос:
Для более простого вопроса я обычно задаю такой же вопрос, но использую пример «квадрат в круге в квадрат». Хотя это очень легко, так что я бы ожидал идеальной алгебры.
Помимо этого, я склоняюсь к тому, чтобы они разработали алгоритм для генерации всех комбинаций набора данных переменной длины.
источник
Лучшие ответы FizzBuzz, которые я видел:
SQL Server 2008
C # (простой)
C # (умный)
источник
Я ищу пару вещей у кандидатов, у которых я брал интервью. По причине, которую я не могу описать в Интернете, у нас довольно плохие кандидаты, и я ожидал этого, поэтому я довольно легко с ними справляюсь. Даже до сих пор я ищу:
Осведомленность о дизайне.
«Покажите мне структуру таблицы для программы адресной книги, в которой есть Контакты с именами и фамилиями, которые могут иметь несколько телефонных номеров с описанием номера (ячейка / дом / работа / и т. Д.)»
Я не ищу здесь диаграмму спецификации UML 2.0, простая пузырьковая диаграмма здесь подойдет. Пока это разумно.
Знание работы с базой данных (т.е. SQL)
Знание тестирования
Предположим, существует метод с сигнатурой,
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
который возвращает результаты вашего запроса ранее. Предположим, что если вы передадите null в метод, он выдаст исключение NullReferenceException. Напишите тест, чтобы продемонстрировать эту функциональность.Напишите тест, который продемонстрирует, что GetPhoneNumbers вернет номер домашнего телефона (123) 456-7890 для человека с фамилией «кузнец».
Знание того, как написать код
Реализуйте метод, который будет соответствовать требованиям тестов, которые вы написали.
Учитывая количество и качество заявителей, которых мы получили, я опросил всех, кто когда-либо серьезно обращался. Я никого не нанял.
источник
Я обычно позволяю им набросать блок-схему последней системы, над которой они работали, спрашивая об отношениях между блоками, и затем позволяю им уточнить блок, над которым они работали / отвечали. Из этого упражнения вы можете многому научиться, например, как человек смотрит за пределы своей маленькой области, насколько ему важно знать «где» он действует, также вы можете узнать о роли, которую он играл, был ли это ключ или сторона роль.
источник
Напишите алгоритм для следующей задачи: Учитывая число n , выведите общее количество (уникальных) двоичных деревьев, которые имеют n узлов.
Таким образом, для n = 0 и n = 1 ответ равен 1. Для n = 2 у вас есть 2: корневой узел, а затем второй узел либо слева, либо справа.
Вы можете получить представление о методах проектирования и посмотреть, думают ли они о рекурсии или запоминании или о решении для динамического программирования.
См. Также это обсуждение StackOverflow для связанного, но другого случая деревьев бинарного поиска.]
источник
Если бы я взял интервью у разработчика программного обеспечения, я бы попросил его спроектировать программное обеспечение и описать требования к оборудованию, чтобы удалить дублирующиеся записи из произвольно большого файла, содержащего полное имя в каждой строке. Я намеренно оставляю некоторые части описания проблемы двусмысленными. Затем я призываю его понять, понимает ли он анализ и уточнение требований, различных компромиссов, структур данных и алгоритмов, операций ввода-вывода (вторичного хранения), программных и аппаратных технологий, масштабируемости и т. Д.
Я думаю, что это небольшая, но сложная проблема, раскрывающая знания и способности заявителя во многих вычислительных областях.
источник
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Многие ребята могли застрять на этом. Если дано какое-то решение - обычно оно использует рекурсию. После того:
Implement the same via 'for'-loop
Не могу сказать, сколько ребят не справились с обеими задачами - 50% кандидатов.
Вот почему мне это нравится :)
источник
fib(n)=round(power(PHI,n)/SQRT5)
. PHI и SQRT5 - это константы, представляющие золотое сечение (1,618 ...) и квадратный корень из 5 соответственно.Для баз данных я иду с:
Напишите мне какой-нибудь SQL-код, который будет дублировать такую таблицу на основе имени (и мне все равно, какой идентификатор я получу, но какой бы ни был возвращен, он должен быть действительным для этого имени). Таким образом, таблица, когда к ней применен правильный SQL, будет выглядеть примерно так:
Я люблю его, потому что:
(Вот где я обнаружил, что есть какой-то совершенно тривиальный способ сделать это, и я все это время слишком усложнял).
источник
SELECT min(ID), Name FROM Things GROUP BY Name
бы сработало, верно?HAVING count(Name) > 1
, но тогда, я думаю, ваш пример ответа не должен включать Бодкина Ван Хорна, Hot Shot, Snimm и Dave.DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. У вас есть предпочтительное решение?Моя любимая проблема с C ++ на доске - заставить кандидата реализовать
Из этого я могу научиться
источник
Как бы вы представляли стандартную колоду из 52 карт? Любой язык программирования в порядке. Как бы вы перемешали карты?
источник
Мой любимый - начать с запроса прототипа printf. Затем, учитывая низкоуровневый API printc (char c), который будет печатать один символ, реализуем printf. Дает всевозможные интересные ответы, такие как стек является частью процессора. Как вы уже догадались, я из C и встроенного фона.
источник
varargs()
или какую-то функцию, подобную этой. Я прав? Я сделал это только один раз, чтобы сказать, что сделал это некоторое время назад.У вас есть миска с 200 рыбами. 99% этих рыб не являются гуппи. Сколько рыбы вы должны удалить, чтобы 2% того, что осталось, было гуппи. Показать свою работу.
Это о запутанных требованиях. Сказано так, чтобы несколько раз менять перспективы в течение одного и того же вопроса. Это предназначено, чтобы видеть, могут ли они выяснить, что действительно происходит.
Вы будете удивлены, как много людей ошибаются.
источник
answer = 100
. [Предполагая, что вы можете выборочно выбрать другую рыбу. Если удалить гуппи, есть и другие ответы.] Хороший вопрос, вы будете удивлены, как мало людей справляются с этим, хотя для программиста это должно быть детской забавой.У меня есть несколько фаворитов, но вот пара, которая почти всегда появляется. Большую часть времени я даю итоговые технические (C ++) интервью, поэтому предпочитаю более длинные и открытые вопросы, которые приводят к новым интересам. Там нет «правильный» ответ, просто открытие для другого разговора.
1) Реализация базового общего указателя, объяснения того, где есть недостатки по сравнению с tr1 или общими указателями boost в их реализации, как его следует использовать и т. Д.
2) Обзор кода. Для опытных сотрудников мы ожидаем, что они смогут уверенно просмотреть предоставленный код на наличие проблем проектирования, ошибок, ошибок кодирования и потенциальных проблем с ремонтопригодностью. Также, конечно, как они это исправят; и иногда, как они передают это сообщение младшему разработчику, которого они сбивают.
источник
Один вопрос, который я использовал с тех пор, как он был использован для меня, заключается в следующем:
Большая часть причины, по которой я его использовал, заключается в том, что вы можете принять решение и двигаться в разных направлениях:
Их ответы на эти вопросы могут дать вам представление о том, как они реагируют на изменяющиеся требования, а также могут ли они учитывать соображения производительности. Сильный кандидат может ответить вопросом о том, какая функция нужна для того, как часто она будет вызываться.
Двигаемся в другом направлении:
Я использую это как способ проверки их латерального мышления. Поскольку вычисление простых чисел может быть медленным, так как максимальное значение становится больше, иногда имеет смысл просто использовать какую-то вычисленную или предварительно рассчитанную справочную таблицу, которая корректируется с учетом проблемы, которую вы пытаетесь решить.
источник
Вот что заставляет задуматься: это просто, включает в себя немного математики и проверяет знания кандидата в области базового компьютерного дизайна (переполнение, числовое представление и т. Д.):
Напишите программу (или процедуру), которая принимает в качестве входных данных пару целых чисел X, Y и определяет, делится ли X * Y на 10. ВАЖНОЕ ПРИМЕЧАНИЕ: X и Y могут быть достаточно большими, чтобы X * Y переполнял самый большой доступный тип целых чисел на твоей машине.
Пример решения:
источник
Заполните следующий метод: PS Режим числа - это число (в списке), которое встречается чаще всего.
Это чтобы увидеть эффективный ваш код.
источник
Как бы вы представили запасную матрицу, которая относительно велика ... скажем, 1000x1000, но содержит не более 100 ненулевых записей?
источник