Сгруппируйте объекты a по code, затем обходите b и выдавайте группу только при первом появлении кода. Так сохранятся все подходящие объекты из a.
Группировка объектов по code с порядком из второго массива
Сгруппируйте объекты a по code, затем обходите b и выдавайте группу только при первом появлении кода. Так сохранятся все подходящие объекты из a.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Условие: Даны два массива объектов. Каждый объект содержит числовое поле code. Верните новый массив, содержащий все объекты из массива a, для которых в массиве b найдётся объект с таким же значением поля code. Порядок элементов в результате определяется порядком элементов в массиве b: объекты из a должны располагаться в том порядке, в каком встречается соответствующий code в b. Если в b встречается несколько одинаковых code, учитывается только первое вхождение.
Входные данные:
- a — массив объектов вида { code: number, ...rest }, длина от 0 до 10^5
- b — массив объектов вида { code: number, ...rest }, длина от 0 до 10^5
Выходные данные: Массив объектов из a, отфильтрованных и упорядоченных по первому вхождению соответствующего code в b.
Ограничения:
- 0 <= a.length, b.length <= 100 000
- Поле code — целое неотрицательное число
- В массиве b могут быть дубликаты code — учитывается только первое вхождение
Пример функции:
# Доступно без импорта: json, sys, io
def intersect_by_code(a, b):
# TODO: напишите решение здесь
return []
Ответ
Сгруппируйте объекты a по code, затем обходите b и выдавайте группу только при первом появлении кода. Так сохранятся все подходящие объекты из a.
Внутри одной группы оставляем исходный порядок a:
def intersect_by_code(a, b):
groups = {}
for item in a:
groups.setdefault(item['code'], []).append(item)
result = []
for item in b:
result.extend(groups.pop(item['code'], ()))
return result
pop одновременно получает группу и исключает её повторную выдачу при дубликатах в b. Входные массивы и объекты не изменяются; новый список содержит ссылки на исходные объекты a. Ожидаемое время O(len(a)+len(b)), память O(len(a)) с учётом групп и результата.