Цікаві задачі з технічних співбесід

 

Відвідав я багато інтерв’ю і був на обох сторонах протистояння. Тепер прийшов час поділитися найбільш цікавими завданнями з оточуючими. Бо інтерв’ю повинні бути цікавими і запам’ятовуються, а не убогих і демотивирующими.

Кілька зауважень

 

  • Всі задачки на логіку та/або про програмуванні. ніякого психологічного підтексту і круглих люків.
  • Рішення не наводиться навмисне. Однак, я запевняю вас, що майже у всіх завдань є просте і красиве рішення. Насолоджуйтесь!

Дзеркальні рядки в SQL

 

Припустимо, що у нас є таблиця з строковою колонкою і ми хочемо знайти схожі рядки, грунтуючись на якому-небудь умови (наприклад, це може бути повнотекстовий пошук або деяка внутрішня функція, яка отримує на вході два значення та повертає true/false). Отже, ми пишемо self-join і, звичайно ж, отримуємо дублі серед значень. Тобто у нас з’являються дзеркальні пари в результаті і підсумкових значень рівно в два рази більше, ніж хотілося б. Питання: як видалити з результату по одному будь-якого елементу з кожної дзеркальної пари і залишити там лише унікальні значення з точністю до перестановок?

Поради і підказки

  • існує одне неочевидне властивість рядків і базових SQL-операторів, яким можна скористатися…
  • Чи можна погуглити, при правильно запиті відповідь буде в першій посиланням на stackoverflow.

 

Пошук “дірок” за допомогою SQL

Це відмінна задачка для оцінки знань з усіх базових можливостей SQL.

Припустимо, що у нас є таблиця з одного интовой колонкою. Ми нічого не знаємо про мінімум/максимум значень в ній. Так само, ми не знає нічого про кількість рядків у таблицю і, в загальному випадку, воно варіюється і ми на нього спиратися не повинні. Ще ми знаємо, що серед значень є пропуски, довжина яких не перевищує одиниці. Наприклад, для таблиці з 5 (п’яти) елементів: 1, 2, 4, 6, 7. Питання: напишіть один SQL-запит використовуючи тільки базові оператори (тобто без процедурщины і змінних), який поверне значення всіх “дірок”. Для вищезазначеного прикладу, результат повинен бути 3, 5. Пам’ятайте, що на місці пропусків немає NULL -значень. Значень 3 і 5 фізично немає в таблиці.

Читайте також  Схожі на ос дрони піднімають тяжкості, допомагаючи собі черевцем

Рада

  • якщо ходу не виходить, напишіть кілька запитів або з використанням pl/sql, а потім, якщо ваша ідея вірна, зможете логічно перейти до одного запитом.

Підказка

  • найбільш красивим запит у разі, якщо запит для вышепреведенных вхідних умов поверне “3, 5”, а “3, 5, 8”.

 

Цикли в односвязном списку

Це задачка про алгоритми і складність.

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

 

Продовження

 

Потрібно модифікувати його так, щоб складність пам’яті O(1). Тобто, щоб споживання пам’яті не залежало від розміру списку.

Підказка

  • пам’ятаєте, що так само, як маса може перетворюватися в енергію, так і часова складність, може конвертуватися в споживання пам’яті і навпаки.

 

Сховище ключ-значення

 

Ще одна задачка на спільне написання коду і його обговорення в ході написання.

Напишіть key-value storage на будь-якому бажаному мовою. Додайте функцію set_all, яка приймає на вхід значення і встановлює його для всіх існуючих ключів. Оцініть витрати часу та пам’яті для отриманої реалізації.

А тепер зробіть set_all, що працює за O(1).

А можна зробити так, щоб складність методів get і set залишилася як в самому початку, а set_all продовжив працювати за O(1)? Якщо так, то реалізуйте. Якщо ні — доведіть чому це неможливо.

 

Порятунок людей

 

А в цій задачі треба подумати і поміркувати разом з собеседуемым. А реалізація — це справа техніки і не особливо цікава.

Читайте також  Як хлопці з Storyline повернулися з Кремнієвої долини в Мінськ з $770 тисячами на стартап

Уявімо, що у нас є група людей. Кількість значення не має. Всю групу вибудовують в лінію в потилицю один одному і кожному на голову одягають чорну або білу капелюх. Ніхто не знає кольору капелюхи, яка на нього надіта. Однак, всі бачать, що відбувається перед ними і чув, що відбувається за ними. Після цього, на спині останнього з групи полходит незнайомець з пістолетом. Він запитує: “який у тебе колір капелюхи?” Відповіддю може бути тільки “чорний” або “білий”. Ніяких інших повідомлень бути не може. Якщо людина вгадав — його відпускають. Інакше відбувається постріл і, в будь-якому разі, процес повторюється з “новим” останнім членом в черзі.

Важливе уточнення: перед початком цього негуманного досвіду, всі члени групи можуть зустрітися і продумати свою стратегію виживання.

Питання: як максимізувати кількість вижили і існує точна оцінка числа тих, що вижили в залежності від розміру групи?

Порада

  • подумайте, як може кожен член зібрати всю доступну інформацію і передати її в одному біті?

Підказка

  • може бути парність/непарність або оператор XOR зможуть вам допомогти?

От і все. Тепер ваша черга вирішити яку-небудь із завдань і розповісти про свою цікавою добірці з/для співбесід.

Степан Лютий

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

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *