Как проверить, что объединение двух списков образует последовательность без пробелов
Что проверяют
Умеете ли вы уточнить условие до кода и выбрать решение по сложности. Формулировка «без пробелов» допускает несколько трактовок, и интервьюер ждёт вопросов. Следом обычно просят оценить сложность и улучшить решение, если списки уже отсортированы.
Как отвечать
Сначала уточните:
- порядок: должна ли конкатенация
a + bидти подряд, как3, 4, 5, 6, или речь только о наборе значений; - дубли: допустимы ли повторы внутри списков и пересечение между ними;
- края: что вернуть для пустых списков, бывают ли отрицательные и нецелые числа.
Если порядок не важен и повторы допустимы, решение через множество, O(n) по времени и памяти:
def is_contiguous(a, b):
s = set(a) | set(b)
return not s or max(s) - min(s) + 1 == len(s)Если повторы запрещены, добавьте проверку len(a) + len(b) == len(s). Если порядок важен, проверяйте соседние пары без склейки списков в новый: all(y - x == 1 for x, y in pairwise(chain(a, b))), где pairwise и chain из itertools, причём pairwise доступна с Python 3.10. Для неупорядоченных данных есть альтернатива: отсортировать и проверить соседей, это O(n log n). Если оба списка уже отсортированы, heapq.merge сольёт их за линейное время без полной сортировки.
Проговорите сложность каждого варианта и почему выбрали именно его: интервьюеру важнее ход мысли, чем самая короткая строка.
Где спотыкаются
Проверяют только max - min + 1 == len(combined) без учёта дублей. На [1, 2, 2] и [4] длина равна четырём, разница тоже, и функция отвечает «да», хотя тройки нет.
Не прогоняют собственные примеры. Ожидаемый вывод, выписанный в комментарии на глаз, часто противоречит коду, и на собеседовании это видно сразу.
Сортируют ради задачи, которая решается множеством за линейное время, или склеивают огромные списки через +, создавая лишнюю копию, когда хватило бы itertools.chain.