题目
给你一个整数数组 nums,返回数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
题解
第一种
我们在函数中先创建两个空数组,分别是front和back,用于存储每个元素左边和右边的乘积,然后我们使用循环进行遍历数组中的每个元素,如果是第一个元素,则将其添加到front和back数组中,并且继续遍历下一个元素,否则我们则分别计算出当前元素左边的乘积和右边的乘积,并将结果添加到front和back数组中,然后我们在函数中在创建一个空数组res,用于存储计算结果,再次使用循环遍历数组中的每个元素,如果是第一个元素,则将back数组中的倒数第二个元素添加到res数组中,并继续遍历下一个元素,如果是最后一个元素,则将front数组中的倒数第二个元素添加到res数组中,并继续遍历下一个元素,否则就将front数组中第i-1个元素和back数组中倒数第i+2个元素的乘积添加到res数组中,最后,我们将res数组返回出去即可
var productExceptSelf = function(nums) { const front = []; const back = []; for (let i = 0; i < nums.length; i ++) { if (i === 0) { front.push(nums[0]); back.push(nums[nums.length - 1]); continue; } const preFront = front[i - 1]; const preBack = back[i - 1]; front.push(preFront * nums[i]); back.push(preBack * nums[nums.length - 1 - i]); } const res = []; for (let i = 0; i < nums.length; i ++) { if (i === 0) { res.push(back[nums.length - 2]); continue; } if (i === nums.length - 1) { res.push(front[nums.length - 2]); continue; } res.push(front[i - 1] * back[nums.length - 2 - i]); } return res; };
第二种
我们在函数中首先定义一个常量len,表示原始数组的长度,接下来定义两个数组left和right,分别用于存储每个元素左侧和右侧的乘积,在left数组中,第一个元素为1,然后从第二个元素开始,每个元素的值都为前一个元素的值乘以原始数组中对应位置的值,在right数组中,最后一个元素为1,然后从倒数第二个元素开始,每个元素的值都为后一个元素的值乘以原始数组中对应位置的值,最后我们使用map方法对原始数组nums进行遍历,将其左侧的乘积和右侧的乘积相乘,得到该元素在新数组中的值返回出去即可
var productExceptSelf = function(nums) { const len = nums.length; const left = [1], right = []; right[len-1] = 1; for(let i = 1; i < len; i++){ left.push(left[i-1] * nums[i-1]); right[len-i-1] = right[len-i] * nums[len-i]; } return nums.map((item,index) => left[index] * right[index]); };