[имя] спросил: реализуй скалярное произведение двух векторов в RLE-представлении, не распаковывая и не сохраняя исходные векторы целиком в памяти.

Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.

Короткий ответ

Что ответить на собеседовании

Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.

Подробный разбор

Ответ с пояснениями

Двигайтесь по двум RLE-потокам одновременно. На каждом шаге берите меньшую оставшуюся длину серии и добавляйте value1 × value2 × длина к результату.

Пусть серия имеет формат (значение, положительная_длина); полные длины векторов должны совпадать.

def dot_rle(left, right):
    left, right = iter(left), iter(right)
    a, b = next(left, None), next(right, None)
    total = 0
    while a is not None and b is not None:
        x, nx = a
        y, ny = b
        if nx <= 0 or ny <= 0:
            raise ValueError('Длины серий должны быть положительными')
        size = min(nx, ny)
        total += x * y * size
        a = next(left, None) if nx == size else (x, nx - size)
        b = next(right, None) if ny == size else (y, ny - size)
    if a is not None or b is not None:
        raise ValueError('Разные длины векторов')
    return total

Для m и n серий время O(m+n), дополнительная память O(1). Входные длины предполагаются целыми; в API этот контракт валидируют отдельно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее