Некоторое время назад у меня был интересный опыт собеседования.Вопрос начался очень просто:
Q1 : у нас есть сумка с номерами 1
, 2
, 3
,…, 100
.Каждый номер появляется ровно один раз, поэтому есть 100 номеров.Теперь один номер случайно выбирается из сумки.Найдите пропущенное число.
Я, конечно, уже слышал этот вопрос на собеседовании, поэтому очень быстро ответил так:
A1 : Ну, сумма чисел 1 + 2 + 3 + … + N
равна (N+1)(N/2)
(см. Википедия: сумма арифметических рядов ).Для N = 100
сумма составляет 5050
.
Таким образом, если в сумке присутствуют все числа, сумма будет точно 5050
.Так как отсутствует одно число, сумма будет меньше этой, а разница в этом числе.Таким образом, мы можем найти это пропущенное число во O(N)
времени и O(1)
пространстве.
В этот момент я думал, что у меня все получилось, но внезапно вопрос принял неожиданный поворот:
Q2 : Это правильно, но как теперь это сделать, если пропущено TWO номеров?
У меня былоникогда не видел / не слышал / не рассматривал эту вариацию раньше, поэтому я запаниковал и не смог ответить на вопрос.Интервьюер настаивал на том, чтобы знать мой мыслительный процесс, поэтому я упомянул, что, возможно, мы можем получить больше информации, сравнивая с ожидаемым продуктом, или, возможно, сделав второй проход после сбора информации с первого прохода и т. Д., Но я действительно просто снималв темноте, а не на самом деле иметь четкий путь к решению.
Интервьюер попытался меня ободрить, сказав, что наличие второго уравнения действительно является одним из способов решения проблемы.В этот момент я был немного расстроен (не зная ответа заранее), и спросил, является ли это общей (читай: «полезной») техникой программирования или это просто ответ с подвохом.
Ответ интервьюера удивил меня: вы можете обобщить технику, чтобы найти 3 пропущенных числа.На самом деле, вы можете обобщить его, чтобы найти k пропущенных чисел.
Qk : если точно k чисел отсутствует вКак бы вы нашли это эффективно?
Это было несколько месяцев назад, и я до сих пор не могу понять, что это за техника.Очевидно, существует нижняя граница времени Ω(N)
, поскольку мы должны отсканировать все числа хотя бы один раз, но интервьюер настаивал на сложности ВРЕМЯ и ПРОСТРАНСТВО сложности метода решения (минус O(N)
время сканирования сканирования) определяется в k не N .
Так что вопрос здесь прост:
- Как бы вырешить Q2 ?
- Как бы вы решили Q3 ?
- Как бы вы решили Qk ?
Пояснения
- Как правило, существует N чисел от 1 .. N , а не только 1..100.
- Я не ищу очевидного решения, основанного на множествах, например, с использованием набора битов , кодирующего присутствие / отсутствие каждого числа значением назначенного бита, поэтому с использованием
O(N)
битовдополнительное пространствоМы не можем позволить себе дополнительное пространство, пропорциональное N . - Я также не ищу очевидного подхода первого порядка.Этот и основанный на множестве подходы стоит упомянуть в интервью (они просты в реализации и в зависимости от N могут быть очень практичными).Я ищу решение Святого Грааля (которое может или не может быть практичным для реализации, но, тем не менее, имеет желаемые асимптотические характеристики).
Итак, еще раз, конечно, вы должны отсканировать вход в O(N)
, но вы можете захватить только небольшое количество информации (определяемой в терминах k , а не N ), и затем должны каким-то образом найти пропущенные числа k .