Альтернативные вопросы FizzBuzz
У кого-нибудь есть хорошие вопросы типа FizzBuzz, которые не являются проблемой FizzBuzz?
Я беру интервью у кого-то, и FB относительно хорошо известен и его не так сложно запомнить, поэтому моя первая остановка в поиске идей - это моя новая зависимость SO.
14 ответов
Я видел небольшой список относительно простых задач программирования, используемых для отсеивания кандидатов, как FizzBuzz. Вот некоторые из проблем, которые я видел, в порядке возрастания сложности:
- Перевернуть строку
- Отменить предложение ("Боб любит собак" -> "Собаки любит Боб")
- Найти минимальное значение в списке
- Найти максимальное значение в списке
- Рассчитать остаток (с учетом числителя и знаменателя)
- Возврат различных значений из списка, включая дубликаты (то есть "1 3 5 3 7 3 1 1 5" -> "1 3 5 7")
- Возвращает различные значения и их количество (т. Е. Приведенный выше список становится "1(3) 3(3) 5(2) 7(1)")
- Для заданной строки выражений (только переменные + и -) и набора пар переменная / значение (т. Е. A =1, b=7, c=3, d=14) возвращается результат выражения ("a + b+c -d"будет -3).
Они были для Java, и вы могли использовать стандартные библиотеки, поэтому некоторые из них могут быть чрезвычайно простыми (например, 6). Но они работают как FizzBuzz. Если у вас есть подсказка о программировании, вы сможете сделать это довольно быстро. Даже если вы плохо знаете язык, вы должны хотя бы дать представление о том, как что-то сделать.
Используя этот тест, один из моих предыдущих боссов видел все: от людей, которые справились с этим довольно быстро, до людей, которые могли сделать все довольно быстро, до одного парня, который не мог ответить ни на один через полчаса.
Я должен также отметить: он позволил людям использовать его компьютер, когда им давали эти задачи. Они были специально проинструктированы, что они могут использовать Google и тому подобное.
Возможно, это не дает прямого ответа на ваш вопрос, но я не уверен, что вам нужно решить еще одну проблему. Помимо того, что "легко запомнить", вопрос FizzBuzz просто "легкий", и в этом суть. Если человек, с которым вы проводите собеседование, относится к классу людей, которым FizzBuzz известен, то они относятся к тому классу, который вопрос типа FizzBuzz не будет отфильтровывать. Это не означает, что вы нанимаете их на месте, но это означает, что они должны быть в состоянии пройти через это и понять суть интервью.
Другими словами, любой, кто найдет время для чтения Coding Horror, заслуживает дальнейшего интервью. Просто попросите их действительно быстро написать решение, кратко обсудить его (например, "Как вы это проверите"), а затем переходите к следующему вопросу. И, как говорится в статье, "поистине удивительно, сколько кандидатов не в состоянии справиться с простейшими задачами программирования".
Любой из ранних проектов Project Euler, вероятно, подойдет.
Например:
Задача 25
Последовательность Фибоначчи определяется рекуррентным соотношением:
Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.
Следовательно, первые 12 терминов будут:
F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144
12-й член, F12, это первый член, который содержит три цифры.
Каков индекс первого члена в последовательности Фибоначчи, который содержит 1000 цифр?
Я обнаружил, что проверка строки, если это палиндром, довольно проста и может быть приличным выходным.
Я хотел вопрос FizzBuzz, который не связан с оператором по модулю. Тем более, что я обычно беру интервью у веб-разработчиков, к которым оператор по модулю просто не приходит так часто. И если это не то, с чем вы регулярно сталкиваетесь, это одна из тех вещей, которые вы ищите, когда вам это нужно.
(Конечно, это концепция, которую, в идеале, вы должны были встретить в курсе математики где-то по пути, но это другая тема.)
Итак, что я придумала, так это то, что я называю "без тройки в обратном порядке". Инструкция:
Напишите программу, которая печатает в обратном порядке каждое кратное 3 от 1 до 200.
Делать это в обычном порядке легко: умножьте индекс цикла на 3, пока не достигнете числа, превышающего 200, затем выйдите. Вам не нужно беспокоиться о том, сколько итераций завершится после, вы просто продолжаете, пока не достигнете первого значения, которое слишком велико.
Но, возвращаясь назад, вы должны знать, с чего начать. Некоторые могут интуитивно понять, что 198 (3 * 66) является наибольшим кратным 3, и, как таковой, жестким кодом 66 в цикле. Другие могут использовать математическую операцию (целочисленное деление или floor() для деления с плавающей запятой 200 и 3), чтобы выяснить это число, и при этом предоставить что-то более общее применимое.
По сути, это та же проблема, что и в FizzBuzz (перебирая значения и распечатывая их, с изюминкой). Это проблема, которую нужно решить, которая не использует ничего более (относительно) эзотерического, чем операция по модулю.
Для чего-то действительно сверхпростого, которое можно сделать за 10 секунд, но удалит тех людей, которые буквально ничего не могут запрограммировать, попробуйте это:
Спросите: покажите мне (на бумаге, но лучше на доске), как бы вы меняли значения двух переменных.
Это была не моя идея, но была опубликована в комментарии кем-то по имени Джейкоб в блоге, посвященном оригинальному вопросу FizzBuzz.
Джейкоб продолжает:
Если они не начинают с создания третьей переменной, вы можете в значительной степени списать этого человека. Я обнаружил, что с помощью одного этого вопроса я могу сократить от трети до половины моих (по общему признанию на тот момент не прошедших проверку) кандидатов.
После этого комментария к исходному сообщению в блоге происходит еще одно интересное обсуждение способов выполнения замены этих переменных без необходимости использования третьей переменной (сложение / вычитание, xor и т. Д.) И, конечно же, если вы используете язык, который поддерживает это. в одном утверждении / операции это может быть не очень хорошим тестом.
Хотя это и не моя идея, я хотел опубликовать это здесь, поскольку это такой элегантно простой и легкий вопрос, на который можно (и нужно) ответить в течение примерно 10 секунд кем-то, кто написал даже самые простые программы. Это также не требует использования несколько явно неясных операторов, таких как оператор по модулю, с которыми многие люди, которые в остальном являются довольно приличными программистами, просто не знакомы (что я знаю по собственному опыту).
Фибоначчи, обратная строка, количество битов, установленных в байте, являются другими распространенными. Project Euler также имеет большую коллекцию возрастающей сложности.
Попросите их написать приложение, чтобы вернуть факторы заданного числа. Это легко сделать и трудно сделать хорошо за короткий период времени. Вы можете увидеть их стиль и то, как они думают о проблемах за короткое время.
Если это интервью на C/C++, убедитесь, что человек знает об указателях.
Общее - простой алгоритм ([одинарный / двойной] связанный список). Спросите о сложности добавления в каждом случае (в начале, в конце, оптимизации...)?
(Общее) Как вы находите минимальное и максимальное значения в массиве (размер N), используя только 3*N/2 сравнения?
C/C++: Как бы вы оптимизировали несколько "strcat" в буфер?
Вернуть индекс первого вхождения строки X в строке Y
Реализация strstr() требует базового понимания языка, обеспечивая возможность для умной оптимизации.
Проверьте 6.14 из C++ FAQ Lite:
Найти список простых чисел - довольно распространенный вопрос, но он все еще требует некоторой размышления, и люди могут давать разные ответы.
Вы также были бы удивлены, как много людей пытаются реализовать структуру данных типа Map/Dictionary.
Я попросил своих кандидатов создать программу для вычисления факториала заданного числа на любом псевдо-языке по своему выбору. Это довольно простая проблема, и она хорошо подходит для естественных последующих вопросов (которые часто можно задать) о рекурсии.
Как насчет: я хочу использовать одно целое число для хранения нескольких значений. Опишите, как это будет работать.
Если они не имеют представления о битовых масках и операциях, они, вероятно, не смогут решить другие проблемы.