Как построить список по правилам пересечения первых i элементов двух списков одинаковой длины
Что проверяют
Первым делом смотрят, уточните ли вы условие. Обычно имеется в виду задача о префиксном общем массиве: даны два списка одинаковой длины, и для каждого i нужно посчитать, сколько чисел встречается одновременно среди первых i + 1 элементов обоих. Дальше смотрят, дойдёте ли вы от квадратичного решения до линейного.
Как отвечать
Проговорите пример: a = [1, 3, 2, 4], b = [3, 1, 2, 4], ответ [0, 2, 3, 4]. Затем спросите, перестановки ли это (каждое число встречается в списке один раз) и что делать с повторами.
Наивный вариант: на каждом шаге len(set(a[:i + 1]) & set(b[:i + 1])). Это O(n²) по времени плюс копирование срезов.
Линейный вариант для перестановок: идём по двум спискам сразу и держим множество уже встреченных чисел. Если число пришло второй раз, значит, оно появилось в обоих префиксах, и счётчик растёт.
def prefix_common(a: list[int], b: list[int]) -> list[int]:
seen: set[int] = set()
common = 0
result = []
for x, y in zip(a, b, strict=True):
for v in (x, y):
if v in seen:
common += 1
else:
seen.add(v)
result.append(common)
return resultВремя O(n), память O(n). Случай x == y обрабатывается сам: первое вхождение кладёт число в seen, второе увеличивает счётчик. strict=True в zip (с Python 3.10) бросит ValueError, если длины разные.
Если повторы разрешены, считайте пересечение мультимножеств: два Counter, и при добавлении числа в один список счётчик растёт, только если в другом этого числа пока больше.
Где спотыкаются
Сравнивают элементы на одинаковых позициях, a[i] == b[i]. Это другая задача, и такое решение сразу засчитывают как непонимание условия.
Останавливаются на пересечении множеств в цикле и не видят, что каждый шаг заново обходит весь префикс.
Не уточняют про повторы. На списках с дублями приём с одним set завышает счёт, а интервьюер почти наверняка подаст такой тест.