Используем два прохода: сначала записываем произведение элементов слева, затем домножаем на произведение справа. Деление не нужно, нули обрабатываются естественно.
Для списка целых чисел вернуть список того же размера,
Используем два прохода: сначала записываем произведение элементов слева, затем домножаем на произведение справа. Деление не нужно, нули обрабатываются естественно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Для списка целых чисел вернуть список того же размера,
где на 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 — произведение пустого набора; при иных требованиях этот случай нужно согласовать.