Я видел небольшой список относительно простых задач программирования, используемых для отсеивания кандидатов, как и 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 .
Например:
источник
Я обнаружил, что проверка строки на то, является ли она палиндромом, довольно проста, и она может быть хорошей прополкой.
источник
scalar(reverse 'foo') == 'foo'
.Мне нужен вопрос FizzBuzz, в котором не используется оператор по модулю. Тем более, что я обычно беру интервью у веб-разработчиков, для которых оператор по модулю встречается не так часто. И если это не то, с чем вы сталкиваетесь регулярно, это одна из тех вещей, которые вы ищите несколько раз, когда вам это нужно.
(Конечно, это концепция, с которой в идеале вы должны были столкнуться на курсе математики где-то по пути, но это уже другая тема.)
Итак, я придумал то, что я без всякого воображения называю « тройки в обратном направлении» . Инструкция такая:
Выполнить это в обычном порядке очень просто: умножьте индекс цикла на 3, пока не дойдете до числа, превышающего 200, затем выйдите. Вам не нужно беспокоиться о том, сколько итераций нужно завершить после, просто продолжайте, пока не достигнете первого слишком высокого значения.
Но, возвращаясь назад, вы должны знать, с чего начать. Некоторые могут интуитивно понять, что 198 (3 * 66) является наибольшим кратным 3, и поэтому жестко запрограммировать 66 в цикл. Другие могут использовать математическую операцию (целочисленное деление или пол () для деления с плавающей запятой 200 и 3), чтобы вычислить это число, и тем самым предоставить что-то более универсальное.
По сути, это та же проблема, что и FizzBuzz (перебирать значения и распечатывать их с изюминкой). Это проблема, требующая решения, которая не использует ничего столь же (относительно) эзотерического, как операция по модулю.
источник
print [x for x in xrange(3, 200, 3)][::-1]
Для чего - то действительно супер-простой , что может быть сделано в течение 10 секунд, но устранило бы тех людей , которые буквально не программа ничего , попробуйте это:
Это была не моя идея, но она была опубликована кем-то по имени Джейкоб в блоге, посвященном исходному вопросу FizzBuzz.
Джейкоб продолжает:
После этого комментария к исходному сообщению в блоге есть еще одно интересное обсуждение способов выполнения этой замены переменных без необходимости использования третьей переменной (добавление / вычитание, xor и т. Д.), И, конечно, если вы используете язык, который поддерживает это в одной инструкции / операции это может быть не такой уж хороший тест.
Хотя это и не моя идея, я хотел опубликовать это здесь, поскольку это такой элегантно простой и легкий вопрос, на который может (и должен) ответить в течение примерно 10 секунд тот, кто написал даже простейшие программы. Это также не требует использования несколько явно непонятных операторов, таких как оператор по модулю, с которым многие люди, которые в остальном довольно приличные программисты, просто не знакомы (что я знаю по собственному опыту).
источник
Фибоначчи, перевернуть строку, подсчитать количество битов, установленных в байте, - другие распространенные. В Project Euler также есть большая коллекция возрастающей сложности.
источник
Попросите их написать приложение, чтобы вернуть множители данного числа. Это легко сделать, но трудно добиться успеха за короткий период времени. Вы можете увидеть их стиль и то, как они решают проблемы за небольшой промежуток времени.
источник
Реализация strstr () требует базового понимания языка, обеспечивая при этом возможность разумной оптимизации.
источник
Если это собеседование на языке C / C ++, убедитесь, что человек знает об указателях.
Общие - простой алгоритм ([одинарный / двойной] связанный список). Спросите о сложности добавления в каждом конкретном случае (в начале, в конце оптимизации ...)?
(Общие) Как найти минимальное и максимальное значение из массива (размер N) с помощью всего 3 * N / 2 сравнений?
C / C ++: Как бы вы оптимизировали несколько strcat для буфера?
источник
Посмотрите версию 6.14 из C ++ FAQ Lite:
http://www.parashift.com/c++-faq-lite/big-picture.html
источник
Как насчет: я хочу использовать одно целое число для хранения нескольких значений. Опишите, как это будет работать.
Если они не имеют представления о битовых масках и операциях, они, вероятно, не смогут решить другие проблемы.
источник
Найти список простых чисел - довольно распространенный вопрос, но он все же требует некоторого размышления, и есть разные степени ответов, которые люди могут дать.
Вы также были бы удивлены, сколько людей изо всех сил пытаются реализовать структуру данных типа Map / Dictionary.
источник
Я попросил своих кандидатов создать программу для вычисления факториала данного числа на любом псевдоязыке по их выбору. Это довольно простая проблема для решения, и она хорошо поддается естественным последующим вопросам (которые часто можно задать) о рекурсии.
источник