238. Произведение массива, кроме самого себя (Medium) (https://leetcode.com/problems/product-of-array-except-self/)

Дан целочисленный массив nums, верните массив answer такой, что answer[i] равен произведению всех элементов nums, кроме nums[i]. Гарантируется, что произведение любого префикса или суффикса nums помещается в 32-битное целое число. Вы должны написать алгоритм, работающий за O(n) и без использования операции деления. Ограничения: - 2 <= nums.length <= 10^5 - -30 <= nums[i] <= 30 - Входные данные сгенерированы так, что answer[i] гарантированно помещается в 32-битное целое число. Дополнительно: Сможете ли вы решить задачу с O(1) дополнительной памяти? (Выходной массив не учитывается при анализе сложности по памяти.)

function productExceptSelf(nums: number[]): number[] {
  let leftProduct = 1,
    rightProduct = 1
  const answer: number[] = []
 
  for (let i = 0; i < nums.length; i++) {
    answer.push(leftProduct)
    leftProduct *= nums[i]
  }
 
  for (let i = nums.length - 1; i > -1; i--) {
    answer[i] *= rightProduct
    rightProduct *= nums[i]
  }
 
  return answer
}
 
// Local check:
console.log(productExceptSelf([1, 2, 3, 4])) // [24, 12, 8, 6]
console.log(productExceptSelf([-1, 1, 0, -3, 3])) // [0, 0, 9, 0, 0]
Example 1:
Input: nums = [1,2,3,4]
Output: [24,12,8,6]
Explanation: - answer[0] = 2 * 3 * 4 = 24 - answer[1] = 1 * 3 * 4 = 12 - answer[2] = 1 * 2 * 4 = 8 - answer[3] = 1 * 2 * 3 = 6
 
Example 2:
Input: nums = [-1,1,0,-3,3]
Output: [0,0,9,0,0]
Explanation: - answer[0] = 1 * 0 * -3 * 3 = 0 - answer[1] = -1 * 0 * -3 * 3 = 0 - answer[2] = -1 * 1 * -3 * 3 = 9 - answer[3] = -1 * 1 * 0 * 3 = 0 - answer[4] = -1 * 1 * 0 * -3 = 0

leetcode