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


88

У когось є якісь хороші запитання типу FizzBuzz, які не є проблемою FizzBuzz?

Я беру інтерв’ю у когось, і ФБ є відносно добре відомим і не таким важким для запам’ятовування, тому моя перша зупинка в пошуку ідей - це моя нова залежність ТАК.

Відповіді:


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
Я читав вашу відповідь деякий час і міг "не зрозуміти, що відбувається, чому мені це не сподобалось, справа у тому, що ваші запитання не цікаві для кодування :) (це нормально, оскільки це було призначено для співбесід). У цьому коментарі немає жодного сенсу, але я просто хотів вивести його з моєї системи. :) вибачте за всі смайлики
Труфа

1
Я хотів би побачити зразки рішень для числа 8. Перші 7 - це легкий вітер, але 8 (для мене) здається трохи складнішим порівняно з іншими. Я розробляю це в Python 3.x, і це зовсім інша гра. Можливо, це просто те, про що я не знаю.
DonutSteve

31

Можливо, це не відповідає прямо на ваше запитання, але я не впевнений, що вам потрібно придумати іншу проблему. Окрім того, що його «легко запам’ятати», питання FizzBuzz є просто «легким», і в цьому полягає суть. Якщо особа, з якою ви берете інтерв'ю, входить до класу людей, яким FizzBuzz є "добре відомим", то вони потрапляють до класу людей, яких питання типу FizzBuzz не відфільтрують. Це не означає, що ви наймаєте їх на місці, але це означає, що вони повинні мати змогу продемонструвати це і перейти до м'яса інтерв'ю.

Іншими словами, будь-хто, хто знаходить час, щоб прочитати Coding Horror , варто взяти подальше інтерв’ю. Просто попросіть їх дуже швидко виписати рішення, коротко обговорити його (наприклад, як ви це перевірити?), А потім перейдіть до наступного питання. І як сказано в статті, "по-справжньому вражає те, скільки кандидатів не здатні виконувати найпростіші завдання програмування".


7
Чудова відповідь. "FizzBuzz - це просто, і це суть ... будь-хто, хто знаходить час, щоб прочитати Cror Horror, варто взяти подальше інтерв'ю" QFT. Я часто запитую кандидатів "куди ви ходите читати про програмування?" Мене завжди дивує те, як багато людей не можуть згадати жодного блогу, веб-сайту чи книги.
Ной Суссман,

1
Я не погоджуюсь. Ми минулого тижня взяли інтерв’ю у когось і попросили його №3 із прийнятої відповіді. Вони буквально сказали "о, я очікував fizzbuzz", а потім не змогли відповісти на наше запитання.
frandroid

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 ++ я б давав бонусні бали за будь-які "функціональні" рішення, які не передбачають рукописного циклу. наприклад, "повернути рівне (str.begin (), str.end (), str.rbegin ());" або (для швидкісних виродків) "повернення рівне (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
Мені цікаво Legion: як ваші веб-розробники роблять такі речі, як заборона зеленого / альтернативні рядки без модуля?
Ендрю Бернс,

4
Добре, якщо ви просто намагаєтесь застосувати стилі до змінних рядків, використовуючи селектор n-потомка CSS3. 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

8

Інші поширені - Фібоначчі, зворотний рядок, підрахунок кількості бітів, встановлених у байті. Проект Ейлер також має велику колекцію зростаючих труднощів.


Фібонааці, хоч і трохи вдосконаленіший, приємний, я повністю новачок, і мені знадобилося 20-25 хв, тому там ваша довідка :)
Труфа

Мене вдарили за допомогою Фібоначчі, FizzBuzz, і я видалив повторювані цілі числа з масиву - все сьогодні в інтерв’ю (4 години)
IAbstract

8

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

Запитайте: покажіть мені (на папері, але краще на дошці), як ви міняєте місцями значення двох змінних.

Це не була моя ідея, але її опублікував хтось на ім’я Джейкоб у коментарі до блогу про оригінальне питання FizzBuzz.

Яків продовжує:

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

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

Хоча це не моя ідея, я хотів опублікувати це тут, оскільки це настільки елегантно просте, легке запитання, на яке може (і має відповісти) приблизно 10 секунд той, хто написав навіть найпростіші програми. Він також не вимагає використання явно незрозумілих операторів, таких як оператор modulo, з яким багато людей, які в іншому випадку є досить пристойними програмістами, просто не знайомі (що я знаю з власного досвіду).


1
Я думаю, це дуже гарна ідея. Це, звичайно, б'є сидіти протягом 20 хвилин, спостерігаючи, поки кандидат болісно налагоджує програму, дивуючись, чому вони використовують foreach замість for і як це виправити! (Як я щойно зробив)
Майк Нельсон

std :: swap (a, b); Чому я повинен створювати третю змінну, коли майже кожна стандартна бібліотека з радістю зробить це за мене?

@Dan - Ідея полягає в тому, що вас попросять це зробити, не використовуючи жодних бібліотек і використовуючи лише вбудовані ключові слова вибраною мовою. Звичайно, у реальному світі для досягнення цього можна використовувати бібліотечну процедуру, так само, як використовувати бібліотечну процедуру для (скажімо) структури зв’язаного списку, а не писати власну. Суть цього тесту полягає в тому, що досить просто, і не виключено, що очікується, що будь-який кандидат зможе це зробити, не потребуючи звернення до бібліотеки для його досягнення.
CraigTP

Тож Яків пропонує співрозмовнику використовувати третю змінну чи ні? Я бачив альтернативи цьому питанню, коли він просить розробника не використовувати третю змінну. Те, як він сформулював свою відповідь, досить неоднозначне.
theGreenCabbage

1
Мене, хто вважає, що вони просто «добре» програміст, це лякало. Моя безпосередня думка була: "Дорогий Боже, я б використав третю змінну, але, безумовно, він хоче розумного способу зробити це без неї!"
Адвокат диявола

4

Попросіть їх написати додаток, щоб повернути множники заданого числа. Це легко зробити і важко зробити добре за короткий проміжок часу. За невеликий проміжок часу ви можете побачити їхній стиль та спосіб їх продумування проблем.


2

Повертає індекс першого входження рядка X всередині рядка Y

Реалізація strstr () вимагає базового розуміння мови, забезпечуючи можливість розумної оптимізації.


2

Якщо це співбесіда на C / C ++, переконайтеся, що людина знає про вказівники.

Загальне - простий алгоритм ([одинарний / подвійний] зв’язаний список). Запитайте про складність додавання в кожному випадку (на початку, в кінці, оптимізація ...)?

(Загальне) Як ви знайдете min та max з масиву (розмір N) лише за допомогою порівнянь 3 * N / 2?

C / C ++: Як би ви оптимізували кілька "strcat" до буфера?


Мені здається, що для задачі "Як ви знайдете min та max з масиву (розмір N) лише із порівняннями 3 * N / 2?" добре пояснити, що число 3 * N / 2 - це ряд порівняння елементів масиву, але ви можете порівняти int вільно, наприклад. наприклад (i <розмір масиву) у циклах.
sergtk


0

Як щодо: Я хочу використовувати одне ціле число для зберігання кількох значень. Опишіть, як це могло би працювати.

Якщо вони не мають уявлення про бітові маски та операції, вони, мабуть, не можуть вирішити інші проблеми.


9
Я б сказав, що це більш повчально, якщо після роз'яснення бітових масок або вказівки на них, якщо людина не цмокає чолом і не трясе головою в глузування. Бітові маски не є загальноприйнятою ідіомою, якщо це не стосується C, вбудованих пристроїв або мереж. Багато талановитих людей цього не робили.
Gregg Lind

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.