Як видно з назви, яка ваша улюблена проблема інтерв'ю на дошці, і чому вона виявилася ефективною для вас?
Молодші, старші, Java, C, Javascript, PHP, SQL, псевдо-код тощо.
Як видно з назви, яка ваша улюблена проблема інтерв'ю на дошці, і чому вона виявилася ефективною для вас?
Молодші, старші, Java, C, Javascript, PHP, SQL, псевдо-код тощо.
Відповіді:
Я прошу кандидата створити рішення проблеми, з якою я насправді стикався в своїй щоденній роботі. Роблячи це, я намагаюся створити діалог між мною та кандидатом. Я намагаюся обговорити про дизайн, який він будує, наче я ніколи раніше не замислювався над проблемою.
Я намагаюся оцінити, чи ми здатні зрозуміти один одного, і чи можемо ми говорити про технічну проблему без плутанини.
(Для розробника java desktop)
Створіть API для обробки історії навігації веб-браузера (попередня сторінка, наступна сторінка, список 10 попередніх сторінок), і це може бути багаторазове використання у багатьох частинах програми (тут я наводжу конкретні приклади в нашому додатку). Потім накресліть реалізацію.
Мені це подобається, тому що він досить простий, його легко проілюструвати, його можна вирішити поетапно (додайте додаткові поведінки, не порушуючи все), він дозволяє говорити про кращі випадки та обробку помилок, а також дозволяє говорити про дані споруди.
Я вважав, що це надзвичайно яскраво під час інтерв'ю з кандидатами та відфільтрування тих, хто не має жодної справи. Він за складністю схожий на Fizz Buzz, але фокусується на навичках баз даних.
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
Я дозволяю їм писати його в будь-якому варіанті SQL, який вони хочуть, і я не надто прискіпливий до незначних проблем із синтаксисом. В основному я хочу знати, що вони розуміють основні поняття реляційних БД.
Більшість кандидатів можуть пройти частину 3 без жодних питань. Ви б здивувались, скільки хто думає, що відповідь на частину 4 - просто змінити оператора з АБО на І в пункті де.
"Намалюйте для мене на дошці дизайн останнього проекту, над яким ви працювали, не розкриваючи мені жодної чутливої деталі".
Реалізувати strcpy
, strcmp
і друзі.
atoi()
.
strdup()
.
strrev()
або обернути рядок функції. Моє рішення на дошці вразило їх, і я зараз працюю.
Мій улюблений, який охоплює кілька дисциплін, - це підрахувати кількість вузлів у двійковому дереві з урахуванням інтерфейсу (у C #):
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
і просто для розваги, ось реалізація, хоча респонденту цього не потрібно бачити.
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
і клас асистента:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
Мені подобається таке рішення:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
Оскільки це демонструє знання:
Два питання, які викликали цікаві для мене дискусії на дошці
Вони починаються просто, а потім стають прогресивно складнішими.
Мені не подобається використовувати головоломку чи дизайн-питання як дошку. Я віддаю перевагу прості, прості запитання, які перевіряють здатність кандидата писати якийсь код. Мої фаворити:
1) Напишіть функцію для зворотного скачування окремо пов'язаного списку. (Мине певний час, перш ніж вони зрозуміють, що їм потрібні 3 вказівники.)
2) Давши двійкове дерево, знайдіть глибину двійкового дерева. (Це питання перевіряє їх здатність писати рекурсивний код. Дозволяє мені перевірити, чи є їх базовий регістр неушкодженим.)
3) Напишіть процедуру двійкового пошуку масиву цілих чисел. (Як каже Джон Бентлі (у програмуванні Pearls), багато людей, як правило, помиляються при написанні двійкового пошуку. Потім можна продовжувати пошук помилок, написання тестових випадків, перегляд коду тощо).
Ми використовували це в одній компанії, в якій працював.
Ми передали кандидату аркуш паперу, який використовується для відстеження часу. Це був реальний графік роботи, який використовував один чи наш підрозділ. Ми попросили кандидата провести нас через процес розробки для створення кращого інструменту відстеження часу. Ніяких меж, не сказала, яка мова і т. Д., Просто хочу побачити, наскільки хороший кандидат був на "повному життєвому циклі". Це дало нам реальне уявлення про те, як вони зібрали вимоги. Як вони структурували таблиці баз даних, який інтерфейс вони можуть робити. Для цього завдання, очевидно, були потрібні навички спілкування. Зазвичай це робилося в кімнаті з кількома великими білими дошками і тривало аж 2 години.
Ми взяли на роботу декількох людей, використовуючи цей процес, і якщо вони справді добре справились із завданням, вони дійсно добре зробили для нас. Якщо вони були незначними, і ми вирішили їх найняти все одно (окрема тема), вони були маргінальними програмістами.
Я використовую проблему, що стосується мого домену програмування.
Якщо я розробляю веб-програми, я хочу побачити, як вони можуть скласти веб-форму, яка видаляє записи, і який підхід вони можуть застосувати до видалення запису з бази даних, наприклад. Це говорить мені, якщо вони знають основні принципи бази даних, як вони взаємодіють з користувачем для перевірки видалення та чи знають вони, що таке м'яке видалення.
У мене немає улюбленого. Проблема, яку я обираю, буде сильно відрізнятися залежно від роботи.
Мені все одно, чи можуть вони вирішити проблему повністю чи ні в інтерв'ю, якими технологіями та мовами вони користуються чи наскільки шалено виглядає їхній код на дошці. Я шукаю шаблон думки; Я хочу побачити, чи знають вони, як продумати та вирішити проблеми.
Моїм улюбленим був один мій друг.
Напишіть мені функцію, щоб генерувати / друкувати / зберігати перші "n" прості числа, а потім поясніть, як це працює і наскільки ефективно воно.
Це добре працює, тому що:
Це алгоритмічне запитання, тому він вимагає, щоб опитуваний міг подумати, а потім пояснити своє мислення - так ви зможете побачити, як працює їхній мозок.
Це мова незалежна.
Навряд чи хтось зрозуміє це цілком правильно (зазвичай є звичайні випадки, які вони пропускають (1 або 2 зазвичай), або вони не обробляють негативні цифри, тож ви можете побачити, як вони обробляють помилки і повідомляють, що вони помиляються.
Більшість роблять це як просте, але дуже повільне сито (наприклад, 80% людей перевірять n - це просте значення, діливши n на всі цілі числа менше n), що дає вам багато можливостей для розмов про те, як вони могли б покращити алгоритм на основі про компроміси та час - наприклад, "чому ви ділите число на 4, якщо ви вже знаєте, що воно не ділиться на 2?" або "Ви розробили, що вам потрібно розділити лише всі прості числа, менші ніж sqrt (n), але це вимагає, щоб ви зберігали ці числа десь, і які наслідки це мають?")
У них немає необхідності в правильній відповіді. Якщо хтось може подумати і пояснити своє мислення, то він буде довгим шляхом, бо бути хорошим кандидатом.
Щось під назвою aff_z, яке було частиною іспитів моєї школи інженерії та було використано як "манекенний" тест, щоб студенти не змогли повернутися з канікул (наша система оцінювання передбачала, що невдача перевірка зупинила маркування, тому невдача цього тесту манекена буде визнати недійсним цілий тест. Змусити вас звернути увагу на диронічні подробиці). Я повторно використовував це один чи два рази під час співбесіди.
У будь-якому випадку ... Я забув точну формулювання, але це було щось подібне ...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
Сумно полягає в тому, що не тільки деякі студенти придумали б надзвичайно суперечливі рішення, коли відповідь є досить очевидним, але що деяким навіть вдасться провалитись.
І вірите чи ні, це траплялося і під час співбесід.
Робити це в інтерв'ю було досить весело, оскільки деякі претенденти почали писати можливі гілки, а потім зрозуміли, що не так (очевидно, якщо ви запитаєте їх лише усно, це цілком зрозуміло, що вони роблять так, як ви говорите ... але якщо ви дайте це в письмовій формі, я вважаю це дивним ...)
Це німо, але я думаю, що це мінімалістичний скринінг (аналогічно, коли я наймаю програмістів JS, я завжди запитую, як оголосити змінну, а потім залежно від їхньої відповіді, чи не використовує var взагалі якась різниця. Дуже часто сумний момент, чесно.)
variablename = variablevalue;
", тоді як хороші з них просто посміялися б по телефону або особисто і безпосередньо сказали мені, з чим би вони були чи не були var
).
Це дійсно залежить від того, що ви шукаєте, як організація, яка робить багато динамічної роботи в Інтернеті з використанням зображень, я, як правило, люблю задавати питання геометрії, що стосується роботи. У будь-якому випадку я схильний задавати питання геометрії, оскільки мені здається, що це хороший тест з математики, який є приємним та наочним і може показати кандидатам здатність візуально представляти свою роботу та методично працювати над проблемою.
Для передових кандидатів я періодично даю таке питання:
На цьому зображенні зображений півмісяць. Ширина півмісяця від B до D становить 9см, а між E і F, 5см. C - центр більшого кола.
а) Будь ласка, обчисліть площу півмісяця.
б) Охарактеризуйте обчислення, необхідні для зміни розміру зображення, щоб він змістився до внутрішнього кола будь-якого заданого розміру, та розташуйте його в колі, якщо відома центральна точка.
Для більш легкого запитання я зазвичай даю такий же питання, але використовую приклад "квадрат у колі в межах квадрата". Хоча це дуже просто, тому я б очікував ідеальної алгебри на ній.
Крім цього, я схильний просити їх створити алгоритм для генерації всіх комбінацій набору даних змінної довжини.
Найкращі відповіді FizzBuzz, які я бачив:
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C # (простий)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C # (розумно)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
Я шукаю кілька речей у кандидатів, з якими я брав інтерв'ю. Через те, що я не можу описати в Інтернеті, ми отримуємо досить бідних кандидатів, і я прийшов очікувати цього, тому мені досить легко. Ще я шукаю:
Поінформованість дизайну.
"Покажіть мені структуру таблиці програми адресної книги, яка містить контакти з іменами та прізвищами, які можуть мати декілька номерів телефонів із описом номера (комірка / дім / робота / тощо)."
Я не шукаю тут специфікаційну діаграму UML 2.0, тут проста нормальна бульбашкова діаграма. Поки це розумно.
Знання роботи з базою даних (тобто SQL)
Знання тестування
Припустимо, існує метод з підписом public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
, який повертає результати вашого запиту від попереднього. Припустимо, що якщо ви передаєте нуль в метод, він видає NullReferenceException. Напишіть тест, щоб продемонструвати цю функціональність.
Напишіть тест, який демонструє, що GetPhoneNumbers поверне домашній номер телефону (123)456-7890 для когось з прізвищем "коваль".
Знання, як написати якийсь код
Реалізуйте метод, який відповідає вимогам тестів, які ви написали.
Враховуючи кількість та якість заявників, яких ми отримали, я взяв інтерв’ю у всіх, хто колись серйозно звертався. Я нікого не наймав.
Зазвичай я дозволяю їм накреслити блок-схему останньої системи, над якою вони працювали, розпитуючи про відносини між блоками, а також дозволяю їм детальніше розкривати блок, над яким вони працювали / відповідали. З цієї вправи ви можете багато чого навчитися, наприклад, як виглядає людина, що виходить за межі свого маленького домену, наскільки йому важливо знати, "де" він діє, також ви можете дізнатися про роль, яку він грав, чи була це ключовою чи стороною роль.
Напишіть алгоритм для наступної проблеми: Враховуючи число n , виведіть загальну кількість (унікальних) двійкових дерев, які мають n вузлів.
Таким чином, для n = 0 і n = 1 відповідь - 1. Для n = 2 у вас є 2: кореневий вузол, а потім другий вузол або зліва, або справа.
Ви можете ознайомитись із методами проектування та побачити, чи думають вони про рекурсію чи запам'ятовування чи рішення щодо динамічного програмування.
[Дивіться також цю дискусію щодо StackOverflow для пов’язаного, але іншого, випадку бінарних дерев пошуку.]
Якби я взяв інтерв'ю у розробника програмного забезпечення, я б попросив його розробити програмне забезпечення та описати вимоги до обладнання, щоб видалити дублікати записів із довільно великого файлу, що містить повне ім’я в кожному рядку. Деякі частини опису проблеми я залишаю цілеспрямовано багатозначною. Тоді я кидаю йому виклик, щоб він зрозумів, аналізуючи та уточнюючи вимоги, різні компроміси, структури даних та алгоритми, введення-виведення (вторинне зберігання), програмні та апаратні технології, масштабованість тощо.
Я думаю, що це невелика, але складна проблема, яка розкриває знання та здібності заявника у багатьох сферах обчислень.
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
Багато хлопців могли затриматися на цьому. Якщо дається якесь рішення - зазвичай використовується рекурсія. Після того:
Implement the same via 'for'-loop
Не можу сказати, скільки стипендіатів не виконали обидва завдання - 50% кандидатів.
Ось чому мені це подобається :)
fib(n)=round(power(PHI,n)/SQRT5)
. PHI і SQRT5 - константи, що представляють відношення золота (1.618 ...) і квадратний корінь 5 відповідно.
Для баз даних я відвідую:
Таблиця: Речі Ідентифікаційне ім’я 1 Бодкін Ван Ріг 2 Хоос-Фус 3 Хоос-Фус 4 Hot-Shot 5 Обличчя повітряної кулі Марвіна О'Гравеля 6 Сонім 7 Обличчя повітряної кулі Марвіна О'Гравеля 8 Обличчя повітряної кулі Марвіна О'Гравеля 9 Дейв
Напишіть мені якийсь SQL, який зніме копію такої таблиці на основі імені (і мені все одно, який ідентифікатор я отримаю назад, але той, який повернуто, повинен бути дійсним для цього імені). Таким чином, таблиця після того, як до неї застосовано правильний SQL, буде представляти щось на зразок:
Таблиця: Речі Ідентифікаційне ім’я 1 Бодкін Ван Ріг 2 Хоос-Фус 4 Hot-Shot 5 Обличчя повітряної кулі Марвіна О'Гравеля 6 Сонім 9 Дейв
Мені це подобається тому що:
(Ось де я знаходжу, що існує якийсь абсолютно тривіальний спосіб зробити це, і я над цим ускладнював усі ці роки).
SELECT min(ID), Name FROM Things GROUP BY Name
спрацювало б, правда?
HAVING count(Name) > 1
, але тоді я думаю, що ваша відповідна відповідь повинна опустити Бодкіна Ван Хорна, Hot Shot, Snimm і Дейва.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. У вас є бажане рішення?
Моя улюблена проблема C ++ на дошці - це запросити кандидата
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
З цього я можу навчитися
Як би ви представляли стандартну колоду на 52 картки? Будь-яка мова програмування - це добре. Як би ви пересували картки?
Моє улюблене - почати із запитання прототипу printf. Потім дається API printc низького рівня (char c), який буде друкувати один символ, реалізувати printf. Дає всілякі цікаві відповіді, як стек є частиною процесора. Як ви могли здогадатися, я із С та вбудованого фону.
varargs()
або виконати якусь функцію. Я прав? Я це зробив лише один раз, щоб сказати, що робив це деякий час тому.
У вас є миска з 200 рибами. 99% цих риб не є гуппі. Скільки риби слід вийняти, щоб 2% того, що залишилося, були гуппі. Покажіть свою роботу.
Йдеться про заплутані вимоги. Так сказано, щоб змінити точки зору кілька разів під час одного і того ж питання. Мається на увазі побачити, чи зможуть вони зрозуміти, що насправді відбувається.
Ви були б здивовані, скільки людей помиляються.
answer = 100
. [Припускаючи, що ви можете вибірково відбирати іншу рибу. Якщо вилучаєте гуппі, є й інші відповіді.] Добре запитання, ви здивуєтеся, як мало хто справляється з цим добре, хоча це має бути дитяча гра для програміста.
У мене є кілька фаворитів, але ось пара, яка майже завжди приходить. Більшу частину часу я роблю заключні технічні інтерв'ю (C ++), тому надаю перевагу більш довгим та відкритим питанням, які призводять до нових цікавих сфер. Немає «правильної» відповіді, лише відкриття до іншої розмови.
1) Впровадження базового загального вказівника, пояснення, де є недоліки порівняно з tr1 або збільшити загальні покажчики при їх реалізації, як його слід використовувати тощо.
2) Огляд коду. Для досвідчених наймань ми очікуємо, що вони зможуть впевнено переглянути деякий наданий код для дизайнерських проблем, помилок, жахів кодування та потенційних проблем з ремонтом. Звичайно, як вони це виправлять; а іноді, як вони дадуть це повідомлення молодшому розробнику, якого вони збивають.
Одне питання, яке я використовую з тих пір, як воно було використано для мене, це таке:
Напишіть функцію для друку всіх чисел від 1 до 100.
Значна частина причини, що я використовую це, пов’язана з тим, що ви можете взяти там рішення і рухатися в різних напрямках:
Як би ви змінили функцію друку всіх чисел між 1 і 1000, 10000 або n ?
Їх відповіді на ці запитання можуть дати тобі зрозуміти, як вони реагують на зміни вимог, а також чи можуть вони визнати міркування щодо ефективності. Сильний кандидат може відповісти на запитання щодо того, яка функція потрібна для того, як часто вона буде називатися.
Рух в іншому напрямку:
Як би ви змінили речі, якби знали, що ця функція буде викликатися кілька разів на хвилину, а продуктивність викликає занепокоєння?
Я використовую це як спосіб перевірки їх бічного мислення. Оскільки обчислення простих чисел може бути повільним, оскільки максимальне значення збільшується, іноді має більше сенсу просто використовувати якусь обчислену або попередньо розраховану таблицю пошуку, яка коригується на основі проблеми, яку ви намагаєтеся вирішити.
Ось один, щоб спровокувати якусь думку - Це просто, включає трохи математики та перевіряє знання кандидата щодо базового дизайну комп’ютера (переповнення, числове представлення тощо):
Напишіть програму (або процедуру), яка приймає пару цілих чисел X, Y як вхід і визначає, чи X * Y рівномірно ділиться на 10. ВАЖЛИВА ПРИМІТКА: X і Y можуть бути досить великими, що X * Y переповнює найбільший доступний цілий тип на вашій машині.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
Заповніть наступний метод: PS Режим числа - це число (у списку), яке має найбільше входжень.
public int getMode(List<Integer> numberList) {
}
Це бачити ваш ефективний код.
Як би ви представляли запасну матрицю, яка є відносно великою ... скажімо, 1000x1000, але має максимум 100 ненульових записів?