Алгоритмические задачи с собеседований аналитика
Алгоритмы·junior·встречалась: Яндекс

Слей два массива с чередованием элементов

Такое дают на скрининге как разминочную задачу: два массива надо «переплести» в один, беря по очереди из первого и второго. Пишется в несколько строк, но проверяет, уверенно ли ты работаешь с индексами и думаешь ли про длины массивов.

Задача

Даны два массива одинаковой длины, например a = [1, 8, 9] и b = [2, 3, 1]. Нужно собрать один массив, чередуя элементы: сначала первый элемент a, затем первый элемент b, затем второй a, второй b, и так далее.

Для примера выше результат — [1, 2, 8, 3, 9, 1].

Решение

def interleave(a, b):
    result = []
    for i in range(len(a)):
        result.append(a[i])
        result.append(b[i])
    return result


cases = [
    ([1, 8, 9], [2, 3, 1]),
    ([1, 2, 3], [4, 5, 6]),
]
for a, b in cases:
    print(f"{a} + {b} -> {interleave(a, b)}")

Разбор

Идея прямолинейная: идём по индексам от 0 до len(a) - 1 и на каждом шаге кладём в результат сначала элемент из a, потом из b с тем же индексом. За один проход собирается переплетённый массив.

Почему через индекс, а не через два цикла подряд. Если сначала выгрузить весь a, а потом весь b, получится конкатенация [1, 8, 9, 2, 3, 1] — не то. Чередование требует синхронного шага по обоим массивам, и индекс i — самый явный способ этот шаг выразить: он один и тот же для a[i] и b[i].

Идиоматичная альтернатива в Python — zip, который как раз ходит по двум последовательностям параллельно:

def interleave(a, b):
    result = []
    for x, y in zip(a, b):
        result.append(x)
        result.append(y)
    return result

Читается чище и не требует ручной работы с индексами. Хороший ход на собеседовании — написать индексный вариант, а потом предложить zip как более «питоничный».

Главная ловушка — разная длина. Индексный цикл идёт по len(a), поэтому если b короче — вылетит IndexError при обращении к несуществующему b[i]; если b длиннее — его хвост молча потеряется. zip ведёт себя иначе: он останавливается на более коротком массиве и лишнее просто отбрасывает без ошибки. Стоит уточнить у собеседующего, гарантированы ли равные длины, и если нет — обсудить, что делать с хвостом (дописать остаток через itertools.zip_longest или обрезать). Именно вопрос про краевой случай отличает вдумчивое решение от «на глаз работает».

Сложность — O(n): один проход, каждый элемент трогаем ровно раз. Родственная задача на сборку результата по правилу — сортировка светофора.

Ожидаемый результат

[1, 8, 9] + [2, 3, 1] -> [1, 2, 8, 3, 9, 1]
[1, 2, 3] + [4, 5, 6] -> [1, 4, 2, 5, 3, 6]

Хочешь так же уверенно решать на собеседовании?

Читать разбор полезно, а настоящая прокачка — самому решать такие задачи и получать обратную связь. Потренируйся в симуляторе аналитика, лёгкий режим — бесплатно.

Прорешать в бесплатной песочнице

Смежные задачи

Вопросы по теме