Я думаю, що є такі легкі запитання: fizzbuzz, перевернути рядок і т. Д., А потім виникають певні запитання, тоді як якщо ви їх ще не бачили, важко отримати оптимальне рішення за призначенням з додатковим тиском інтерв'ю та короткий час обмеження. Найгірше, що іноді рекрутери, які не мають технічних знань, задають деякі з цих питань, і вони шукають дуже конкретну відповідь .... Якщо ви не дасте оптимальної відповіді, вони вважають вас абсолютним ідіотом. Навіть якщо ваша відповідь спрацює, вирішує проблему, і хоча вона не може бути оптимальною, вона не є надто неефективною ....
Деякі приклади:
як би ви перемішали колоду карт? Вони шукають метод Фішера-Йейта http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffleінші відповіді "неправильні" ..... Це, ймовірно, не те, що ви знаєте, якщо ви раніше не хотіли перемішувати картки та спеціально шукати їх. Ви можете наткнутися на це під час виконання відповіді, але, зважаючи на те, що я бачив, вони очікують, що ви дізнаєтесь про цю застуду, тому сумнівно, що буде багато часу, щоб дозволити знайти рішення. Ще один менш ефективний (але, можливо, більш очевидний) спосіб - створити новий масив із вказівником на початковий масив та число, яке є випадковим числом, а потім сортувати масив за випадковим числом. Потім використовуйте відсортований масив для побудови нового масиву карт. У будь-якому випадку, я отримав 0 кредитів за те, щоб представити це рекрутеру.
Іншим прикладом є питання про те, як ви могли б виявити дублікат числа в списку з n чисел, всі від 1 до n-1. Очевидна відповідь (що відносно ефективно в часовій перспективі) - використовувати хеш-таблицю для вставки кожного елемента, і якщо ви знайшли вже вставлений, ви знайшли дублікат. Оптимальна відповідь полягає в тому, що числа є від 1 до n, якщо немає дублікатів, ви можете отримати очікувану суму як n (n + 1) / n. Тоді, якщо ви підсумуєте масив, ви отримаєте фактичну суму, що менша ніж очікувана сума. Таким чином, в основному n - (очікувана сума - фактична сума) = повторюване число ... Це досить особливий випадок .... я насправді щось бачив раніше в якомусь онлайновому дописі про проблеми інтерв'ю століття тому, про пов'язане з тим самим фокусом, так Мені було добре ...
Інший - переверніть усі слова в рядку, не використовуючи додаткового пробілу. Мені довелося подумати над цим, і рекрутер був дуже нетерплячим за 5 хвилин, які я думав (розщеплення та повторне приєднання рядка в зворотному порядку, або перехід слова за словом у новий масив - це дуже просто). Я придумав межу останнього слова, знайшов кінець першого слова і постійно зміщував увесь список вниз на 1, а потім вставляв відповідну букву. Потім повторюйте, поки не досягнете кінця списку. Цей метод спрацював, і інтерв'юер погодився (він трохи технічний), але він досить неефективний. Повернувшись додому, я шукав оптимальну відповідь, і це просто перевернути список, а потім змінити кожне окреме слово. Деякі люди можуть придумати це,
Тепер це правда, коли ви побачили деякі з цих проблем, ви зможете вирішити їх простіше. Тому що з одними і тими ж хитрощами виникають подібні запитання. Я знаю, особливо формула n (n-1) / 2 і список номерів має кілька варіацій. Але я ще не знаю, що перевіряє ці питання. FizzBuzz - це те, що кожен повинен вміти робити (хоча я бачив варіанти, не такі прості, і в такому випадку я починаю сумніватися, навіть якщо це реально для ситуації інтерв'ю, не маючи змоги ввести / налагодити код). Деякі з цих питань очевидні, як тільки ви їх бачите, але якщо ви ще не бачили їх, вони не очевидні. Зрештою, хтось згадав, що для того, щоб з’явилася перша правильна реалізація бінарного пошуку, потрібні роки ... Зараз двійковий пошук настільки очевидний, тому що кожен може прочитати про нього.
Тим не менш, я думаю, що найгірше - це те, що люди, нетехнічні задають питання, тому що вони не можуть оцінити ваше рішення, є правильним, але не оптимальним. Вони просто знають, що ваше рішення не є представленим, а отже, це все неправильно, ви не отримуєте жодної кредити за спробу. Навіть неоптимальні рішення часто показують знання конструктивних програм. Якщо я не програмую покерні ігри, мені байдуже, наскільки добре хтось може перетасувати колоду карт. І навіть якби я був, показавши їм ефективний алгоритм, я впевнений, що хтось на півдорозі може дотримуватися цього.
Питання щодо шаблону, як видається, просто дають перевагу кандидатам, які довше беруть інтерв'ю, оскільки, швидше за все, вони бачили більше запитань до шаблону. Навіть FizzBuzz, коли ви вперше побачите це, ви можете зникнути, але, коли ви бачите це знову і знову, ви звикаєте до нього. Найкраще, що ви могли зробити, - це задати кодування, яке вимагає спеціальної логіки бізнесу. Наприклад, створіть деякий набір даних (масив об'єктів / записів), а потім створіть деякі бізнес-правила, які слід застосувати до кожного об'єкта та повернути відповідь. Хоча вони, мабуть, бачили цикл через записи і застосовують логіку в мільйон разів, ваші правила будуть унікальними, так що принаймні їм доведеться зрозуміти і успішно реалізувати створені вами правила.
Скажімо, запланована зарплата та список кандидатів та їхні 3 найкращі улюблені відеоігри та, можливо, початкова зарплата. Кандидати, яким подобається Зельда, отримують штраф у розмірі 300, кандидати, яким подобається маленька русалка, отримують 200 бонусів. Кандидати, яким подобається Donkey Kong та Super Mario Brothers, але не доктор Маріо, отримують 300 бонусів. Кандидати, яким подобається Metroid або Kid Icarus, отримують 200 бонусів тощо. Це здається трохи божевільним, але це би показало вам їхню здатність перекладати бізнес-правила в логічні побудови програми і перевірити своє розуміння булевої логіки. Загалом, не сильно відрізняється від fizzbuzz, за винятком того, що не використовується модуль і петлі. Звичайно, ви можете надати їм список і перенести його через нього, а також надрукувати результати на екрані, використовуючи також конкретні критерії виводу.