Для списка целых чисел вернуть список того же размера,

Используем два прохода: сначала записываем произведение элементов слева, затем домножаем на произведение справа. Деление не нужно, нули обрабатываются естественно.

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

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

Используем два прохода: сначала записываем произведение элементов слева, затем домножаем на произведение справа. Деление не нужно, нули обрабатываются естественно.

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

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

Условие

Для списка целых чисел вернуть список того же размера,
где на i-ой позиции – произведение всех элементов списка,
кроме самого элемента на позиции i исходного списка

Примеры:
[2, 3, 4] -> [34, 24, 2*3] -> [12, 8, 6]

def product_except_self(nums: list[int]) -> list[int]: # your code here

Ответ

Используем два прохода: сначала записываем произведение элементов слева, затем домножаем на произведение справа. Деление не нужно, нули обрабатываются естественно.

def product_except_self(nums: list[int]) -> list[int]:
    result = [1] * len(nums)
    prefix = 1
    for i, value in enumerate(nums):
        result[i] = prefix
        prefix *= value
    suffix = 1
    for i in range(len(nums) - 1, -1, -1):
        result[i] *= suffix
        suffix *= nums[i]
    return result

Перед вторым проходом result[i] содержит произведение строго слева от i, suffix — строго справа. Для [2, 3, 4] получим [12, 8, 6]. Время O(n), дополнительная память O(1) без учёта результата. Для единственного элемента получится 1 — произведение пустого набора; при иных требованиях этот случай нужно согласовать.

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

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

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

Подробнее