Адовые задачи с собеседований для программистов
Держите пять непростых задач с интервью для программистов. Большинство из них имеет несколько решений. Предложите своё?
28К открытий30К показов
Задачи на собеседованиях для программистов характеризуются видимой сложностью, но если спокойно разобраться, всё решается довольно просто. Мы подготовили несколько заковыристых задач и решения к ним.
- Алгоритмическая задача про острова
- Поиск знаменитости
- Миллион наименьших чисел
- Сумма чисел
- Тёплые дни: задача на стек
Алгоритмическая задача про острова
Для двумерного массива M x N
, состоящего из единиц, которые обозначают сушу, и нулей, обозначающих воду, верните количество островов.
Остров окружён водой и образован соединением соседних земель по горизонтали и вертикали. Вы можете предположить, что все четыре края матрицы окружены водой.
Примечание Если островов нет, возвращаем 0
.
Решение
Для начала нам нужно найти в матрице хотя бы одну единицу: начинаем построчный обход с нулевого индекса [0,0]
. Когда мы находим единицу, помечаем её, как просмотренную, и также просматриваем соседние клетки по направлениям вправо, вниз, влево, вверх.
Если предыдущая ячейка была сушей, а следующая оказалась водой, мы возвращаемся к суше и просматриваем ячейки по перечисленным направлением в том же порядке.
Код
Поиск знаменитости
А эта задача с собеседований встречалась программистам при трудоустройстве в Amazon.
Дана группа людей из K
человек, и эти люди могут знать друг друга, необязательно взаимно. Среди них есть знаменитость. Знаменитость — это человек, который не знает никого в компании, зато каждый из компании знает его. Изначально мы не владеем информацией о том, кто кого знает, но мы можем спросить у каждого участника, знает ли он других людей из группы. Нужно определить знаменитость, используя минимальное количество вопросов.
Решение
Для начала определимся с тем, что знаменитость всего одна. Чтобы понять следующий алгоритм решения, давайте посмотрим на двух людей из группы. Обозначим их как A и B.
Когда мы спрашиваем у A, знает ли он B, мы получаем два варианта ответа:
- Знает — человек A не знаменитость.
- Не знает — человек B не знаменитость.
Так, задав всего один вопрос, мы избавляемся от одного кандидата на статус знаменитости. Именно этот алгоритм мы и используем в программе: опрашивается пара человек, после чего один из них вычёркивается из списка, и так пока не останется один кандидат.
Но наличие одного кандидата ещё не означает, что он знаменитость, ведь её может не быть вовсе. Поэтому последние два действия состоят в том, чтобы спросить у остальных, знают ли они кандидата, а у кандидата — знает ли он всех остальных.
Код
Миллион наименьших чисел
Опишите алгоритм для нахождения миллиона наименьших чисел в наборе из миллиарда чисел. Память компьютера позволяет хранить весь миллиард чисел.
Решение
Есть несколько способов решить поставленную задачу:
- Сортировка
- Минимум кучи
- Ранжирование
Каждый из этих способов мы разобрали в нашей статье по нахождению миллиона наименьших чисел.
Сумма чисел
Такая задача нередко встречается на интервью, и в стрессовой ситуации программист действительно может сразу не сориентироваться.
Дан отсортированный массив чисел, включая отрицательные, и некое число K
. Нужно найти два числа из массива, которые в сумме дадут число K
. Если таких чисел нет, в результате возвращаем пустой массив. Если комбинаций чисел, дающих нужную сумму, несколько, возвращаем любую из них.
Есть несколько вариантов решения задачи:
- перебор всех пар — временная сложность алгоритма O(n²);
- HashSet — O(n);
- бинарный поиск — O(n log n);
- два указателя — O(n).
Давайте решим задачу с помощью HashSet.
Примечание Хоть метод HashSet и работает за один проход по массиву, он тратит дополнительную память, так как в худшем случае мы перенесём все элементы из входного массива в наш сет.
Решение
Создаём пустой сет и смотрим первый элемент массива. Добавляем его в сет. Далее смотрим второй элемент и то, даёт ли он в сумме с вынесенным в сет первым элементом K
. Если нет, просто переносим его в сет. Так мы продолжаем до тех пор, пока не найдём число, которое в сумме с другим числом из сета даст число K
. Выводим массив из этих двух элементов в качестве ответа.
Код
Тёплые дни: задача на стек
Дан массив чисел, состоящий из N
элементов. Эти числа обозначают температуру в конкретный день. Для каждого дня нужно найти количество суток до наступления более тёплого дня.
Вот пример того, как это можно изобразить:
Решение
Используем два цикла. В первом мы будем идти по всем дням, для которых хотим определить ответ, а во втором пробегать направо до тех пор, пока не наткнёмся на более тёплый день.
Код
Понравились задачки? Держите ещё десять непростых задач на логику, которые часто задают программистам на собеседованиях.
28К открытий30К показов