# leetcode 238 Product of Array Except Self ###### tags: `leetcode` `Javascript` ```javascript /** * @param {number[]} nums * @return {number[]} */ var productExceptSelf = function(nums) { const result = []; let productSoFar = 1; for (let i = 0; i < nums.length; i++) { result[i] = productSoFar; productSoFar *= nums[i] } productSoFar = 1; for (let j = nums.length - 1; j >= 0; j--) { result[j] *= productSoFar; productSoFar *= nums[j]; } return result; }; ``` ## 解析 不能用除法,代表一開始不能乘進去,於是我們可以拆成兩部分 ``` input [1,2,3,4,5] result 1 = product [] * product [2,3,4,5] result 2 = product [1] * product [3,4,5] result 3 = product [1,2] * product [4,5] result 4 = product [1,2,3] * product [5] result 5 = product [1,2,3,4] * product [] ``` 當前 index 的結果為前面相乘的結果乘以後半部相乘的結果。 預先乘好不包含自己的前半部及後半部 ```javascript let product = 1; // 前半部 const productFronts = []; for(let i = 0; i < nums.length; i++){ productFronts.push(product); product *= nums[i]; } // 後半部 product = 1; const productBacks = []; for(let i = nums.length - 1; i >= 0; i--){ productFronts.unshift(product); product *= nums[i]; } ``` 結果為 ``` -> productFronts = [1, 1, 2, 6, 24] <- productBacks = [120, 60, 20, 5, 1] ``` `productFronts` 與 `productBacks` 相乘及為答案 ``` [ 1, 1, 2, 6, 24] x x x x x [120, 60, 20, 5, 1] [120, 60, 60, 30, 24] ``` ## 再化簡 後半部的部分可以不必重新紀錄,可以在從最後面累乘的時候順便與前半部相乘直接為當前 index 答案。