Альтернативные вопросы FizzBuzz [закрыто]


88

Кто - нибудь есть какие - либо вопросы типа хорошо FizzBuzz, которые не проблема FizzBuzz?

Я беру интервью у кого-то, и FB относительно хорошо известен и его не так сложно запомнить, поэтому моя первая остановка в поисках идей - это моя новая зависимость SO.

Ответы:


104

Я видел небольшой список относительно простых задач программирования, используемых для отсеивания кандидатов, как и FizzBuzz. Вот некоторые из проблем, которые я видел, в порядке возрастания сложности:

  1. Переверните строку
  2. Переверните предложение («Боб любит собак» -> «собакам нравится боб»)
  3. Найдите минимальное значение в списке
  4. Найдите максимальное значение в списке
  5. Вычислить остаток (с учетом числителя и знаменателя)
  6. Возврат различных значений из списка, включая дубликаты (например, «1 3 5 3 7 3 1 1 5» -> «1 3 5 7»)
  7. Возвращает различные значения и их количество (т. Е. Список выше становится «1 (3) 3 (3) 5 (2) 7 (1)»)
  8. Для данной строки выражений (только переменные, + и -) и набора пар переменная / значение (т.е. a = 1, b = 7, c = 3, d = 14) вернуть результат выражения ("a + b + c -d "будет -3).

Они были для Java, и вы могли использовать стандартные библиотеки, поэтому некоторые из них могут быть чрезвычайно простыми (например, 6). Но работают они как FizzBuzz. Если у вас есть представление о программировании, вы сможете сделать это очень быстро. Даже если вы плохо знаете язык, вы должны хотя бы уметь дать представление о том, как что-то делать.

Используя этот тест, один из моих предыдущих боссов видел все: от людей, которые справились со всем довольно быстро, до людей, которые могли делать очень быстро, до одного парня, который не мог ответить ни на один через полчаса.

Следует также отметить: он позволял людям пользоваться своим компьютером, пока им давали эти задачи. Их специально проинструктировали, что они могут использовать Google и тому подобное.


Будет ли принято решение по пункту 8 на основе JSR-223 (javax.script)? :-P (По общему признанию, использование этого совершенно излишне, но некоторые люди предпочли бы это сделать, чем использовать, скажем, java.util.Scanner.)
Крис Джестер-Янг,

4
Это не входит в мое представление о духе вопроса, но если вы знаете достаточно, чтобы предложить это, то вы определенно знаете достаточно, чтобы пройти вопросы FizzBuzz, поэтому я не буду возражать против вас. Это может быть даже плюсом в вашу пользу. Я бы все же, наверное, спросил, как бы вы это сделали без javax.script.
MBCook

3
Я читал ваш ответ какое-то время и не мог понять, что происходит, почему мне это не понравилось, дело в том, что ваши вопросы не интересно кодировать :) (что нормально, так как это было предназначено для интервью). В этом комментарии нет реального смысла, я просто хотел убрать его из моей системы. :) извините за все смайлы
Trufa

1
Хотел бы увидеть примеры решений для номера 8. Первые 7 - пустяк, но 8 (мне) кажется немного сложнее по сравнению с остальными. Я работаю над этим в Python 3.x, и это совсем другая игра. Наверное, я чего-то не знаю.
DonutSteve

31

Возможно, это не дает прямого ответа на ваш вопрос, но я не уверен, что вам нужно придумывать другую проблему. Помимо того, что «легко запомнить», вопрос FizzBuzz просто «легкий», и в этом суть. Если человек, с которым вы проводите собеседование, принадлежит к тому классу людей, для которого FizzBuzz «хорошо известен», то он относится к тому классу людей, который не может отфильтровать вопрос типа FizzBuzz. Это не означает, что вы нанимаете их на месте, но это означает, что они должны пройти через это и перейти к сути собеседования.

Другими словами, любой, кто нашел время, чтобы прочитать Coding Horror , заслуживает дальнейшего интервью. Просто попросите их быстро выписать решение, кратко обсудить его (например, как вы это проверить?), А затем переходите к следующему вопросу. И, как говорится в статье, «действительно удивительно, сколько кандидатов неспособны решать простейшие задачи программирования».


7
Отличный ответ. «FizzBuzz - это просто, и в этом суть ... любой, кто нашел время, чтобы прочитать Coding Horror, заслуживает дальнейшего интервью» QFT. Я часто спрашиваю кандидатов «где вы идете читать о программировании?» Меня всегда удивляет, сколько людей не могут упомянуть ни одного блога, веб-сайта или книги.
Ной Сассман,

1
Я не согласен. На прошлой неделе мы брали интервью у кого-то и спросили его №3 из принятого ответа. Они буквально сказали: «О, я ожидал шипения», а потом не смогли ответить на наш вопрос.
frandroid 05

23

Вероятно, подойдет любой из ранних от 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 цифр?


14

Я обнаружил, что проверка строки на то, является ли она палиндромом, довольно проста, и она может быть хорошей прополкой.


Я бы сказал, это зависит от языка. В C это может быть интересно, в Perl с этим покончено scalar(reverse 'foo') == 'foo'.
jkramer

3
правда, но в то же время ценно возможность увидеть более простое решение ... тогда вы говорите: «Хорошо, теперь представьте, что у вас нет обратной функции».
Майк Стоун,

1
В C ++ я бы дал бонусные баллы за любые «функциональные» решения, которые не включают рукописный цикл. например, «return equal (str.begin (), str.end (), str.rbegin ());» или (для фанатиков скорости) «return equal (str.begin (), str.begin () + str.size () / 2, str.rbegin ());»
Крис Джестер-Янг,

1
Конечно, увидев такой ответ, я также попрошу кандидата объяснить, как работает код. Они не могут встать на ноги, просто скопировав мой ответ выше! :-P
Крис Джестер-Янг,

10

Мне нужен вопрос FizzBuzz, в котором не используется оператор по модулю. Тем более, что я обычно беру интервью у веб-разработчиков, для которых оператор по модулю встречается не так часто. И если это не то, с чем вы сталкиваетесь регулярно, это одна из тех вещей, которые вы ищите несколько раз, когда вам это нужно.

(Конечно, это концепция, с которой в идеале вы должны были столкнуться на курсе математики где-то по пути, но это уже другая тема.)

Итак, я придумал то, что я без всякого воображения называю « тройки в обратном направлении» . Инструкция такая:

Напишите программу, которая выводит в обратном порядке каждые 3 числа от 1 до 200.

Выполнить это в обычном порядке очень просто: умножьте индекс цикла на 3, пока не дойдете до числа, превышающего 200, затем выйдите. Вам не нужно беспокоиться о том, сколько итераций нужно завершить после, просто продолжайте, пока не достигнете первого слишком высокого значения.

Но, возвращаясь назад, вы должны знать, с чего начать. Некоторые могут интуитивно понять, что 198 (3 * 66) является наибольшим кратным 3, и поэтому жестко запрограммировать 66 в цикл. Другие могут использовать математическую операцию (целочисленное деление или пол () для деления с плавающей запятой 200 и 3), чтобы вычислить это число, и тем самым предоставить что-то более универсальное.

По сути, это та же проблема, что и FizzBuzz (перебирать значения и распечатывать их с изюминкой). Это проблема, требующая решения, которая не использует ничего столь же (относительно) эзотерического, как операция по модулю.


2
Мне любопытно, Легион: как ваши веб-разработчики делают такие вещи, как выделение зеленых полос / чередование строк без модуля?
Эндрю Бернс,

4
Хорошо, если вы просто пытаетесь применить стили к чередующимся строкам, используя селектор CSS3 nth-child. В jQuery также есть чередующиеся селекторы для выполнения таких действий через JS. Но, говоря о вашей более важной мысли, как я уже сказал выше, это то, что ищут, используют, а затем быстро забывают, потому что на поиск ушло все 15 секунд. Я не говорю, что мне это нравится или одобряю, но особенно на начальном уровне такое случается. :)
Легион

1
вот мое решение php :) ideone.com/BnJQ3 3 минуты :)
Trufa

Это должно быть сложнее в языках нижнего уровня, потому что в Ruby это так же просто, как вставить числа (по порядку) в массив, а затем полностью изменить его местами. ideone.com/MKKb6
Керрик

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit

9

Для чего - то действительно супер-простой , что может быть сделано в течение 10 секунд, но устранило бы тех людей , которые буквально не программа ничего , попробуйте это:

Спросите: покажите мне (на бумаге, но лучше на доске), как бы вы поменяли местами значения двух переменных.

Это была не моя идея, но она была опубликована кем-то по имени Джейкоб в блоге, посвященном исходному вопросу FizzBuzz.

Джейкоб продолжает:

Если они не начнут с создания третьей переменной, вы можете списать этого человека со счетов. Я обнаружил, что могу сократить от трети до половины моих (по общему признанию, на тот момент не прошедших проверку) кандидатов, задав один только этот вопрос.

После этого комментария к исходному сообщению в блоге есть еще одно интересное обсуждение способов выполнения этой замены переменных без необходимости использования третьей переменной (добавление / вычитание, xor и т. Д.), И, конечно, если вы используете язык, который поддерживает это в одной инструкции / операции это может быть не такой уж хороший тест.

Хотя это и не моя идея, я хотел опубликовать это здесь, поскольку это такой элегантно простой и легкий вопрос, на который может (и должен) ответить в течение примерно 10 секунд тот, кто написал даже простейшие программы. Это также не требует использования несколько явно непонятных операторов, таких как оператор по модулю, с которым многие люди, которые в остальном довольно приличные программисты, просто не знакомы (что я знаю по собственному опыту).


1
Думаю, это очень хорошая идея. Это определенно лучше, чем сидеть без дела в течение 20 минут, наблюдая, как кандидат мучительно отлаживает программу, задаваясь вопросом, почему они использовали foreach вместо for и как это исправить! (Как я только что сделал)
Майк Нельсон

std :: swap (а, б); Зачем мне создавать третью переменную, если почти каждая стандартная библиотека с радостью сделает это за меня?

@Dan - Идея в том, что вас просят сделать это без использования каких-либо библиотек и с использованием только встроенных ключевых слов на выбранном вами языке. Конечно, в реальном мире вы можете использовать библиотечную процедуру для достижения этой цели, так же, как использование библиотечной процедуры для (скажем) структуры связанного списка, а не для написания своей собственной. Смысл этого теста в том, что он достаточно прост, и не исключено, что любой кандидат сможет выполнить его без необходимости. прибегать к библиотеке для достижения этой цели.
CraigTP

Так Джейкоб предлагает интервьюируемому использовать третью переменную или нет? Я видел альтернативы этому вопросу, когда разработчику предлагалось не использовать третью переменную. Он сформулировал свой ответ довольно неоднозначно.
theGreenCabbage

1
Меня как человека, который думает, что он просто «нормальный» программист, это напугало. Моей немедленной мыслью было: «Дорогой Бог, я бы использовал третью переменную, но, конечно же, ему нужен какой-нибудь умный способ сделать это без нее!»
Адвокат дьявола,

8

Фибоначчи, перевернуть строку, подсчитать количество битов, установленных в байте, - другие распространенные. В Project Euler также есть большая коллекция возрастающей сложности.


Fibonaaci, хоть и немного более продвинутый, но хороший, я новичок, и это заняло у меня 20-25 минут, так что вот ваша ссылка :)
Trufa

Меня поразили Fibonacci, FizzBuzz и удаление повторяющихся целых чисел в массиве - все это сегодня в интервью (4 часа)
IAbstract

4

Попросите их написать приложение, чтобы вернуть множители данного числа. Это легко сделать, но трудно добиться успеха за короткий период времени. Вы можете увидеть их стиль и то, как они решают проблемы за небольшой промежуток времени.


2

Вернуть индекс первого вхождения строки X в строке Y

Реализация strstr () требует базового понимания языка, обеспечивая при этом возможность разумной оптимизации.


2

Если это собеседование на языке C / C ++, убедитесь, что человек знает об указателях.

Общие - простой алгоритм ([одинарный / двойной] связанный список). Спросите о сложности добавления в каждом конкретном случае (в начале, в конце оптимизации ...)?

(Общие) Как найти минимальное и максимальное значение из массива (размер N) с помощью всего 3 * N / 2 сравнений?

C / C ++: Как бы вы оптимизировали несколько strcat для буфера?


Мне кажется, что для проблемы «Как найти min и max из массива (размер N) с помощью всего 3 * N / 2 сравнений?» Хорошо бы уточнить, что число 3 * N / 2 - это количество сравнений элементов массива, но вы можете, например, свободно сравнивать int. например (i <размер массива) в циклах.
sergtk


0

Как насчет: я хочу использовать одно целое число для хранения нескольких значений. Опишите, как это будет работать.

Если они не имеют представления о битовых масках и операциях, они, вероятно, не смогут решить другие проблемы.


9
Я бы сказал, что было бы более поучительно, если бы после объяснения или указания на битовые маски человек не шлепает себя лбом и не качает головой в насмешке над собой. Битовые маски - не обычная идиома, если только не C, встроенные устройства или сеть. Многие талантливые люди этого не сделали.
Грегг Линд,

2
Хм, тогда вам нужно решить, следует ли принимать сохранение 1,2 и 3 в десятичной системе счисления 123 в качестве правильного ответа, даже если математика будет уродливо сложной по сравнению с простым объявлением 3 переменных. Или сохраните 1,2,3, написав x = 1; х = 2; х = 3; Я имею в виду, нужно ли нам хранить эти значения одновременно?
MatthewMartin,

0

Найти список простых чисел - довольно распространенный вопрос, но он все же требует некоторого размышления, и есть разные степени ответов, которые люди могут дать.

Вы также были бы удивлены, сколько людей изо всех сил пытаются реализовать структуру данных типа Map / Dictionary.


0

Я попросил своих кандидатов создать программу для вычисления факториала данного числа на любом псевдоязыке по их выбору. Это довольно простая проблема для решения, и она хорошо поддается естественным последующим вопросам (которые часто можно задать) о рекурсии.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.