文章目录
- 1、问题
- 2、示例
- 3、解决方法
- (1)方法1
- 总结
1、问题
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
2、示例
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
题目的详细说明:如示例1:
2 * 3 * 4 = 24
1 * 3 * 4 = 12
1 * 2 * 4 = 8
1 * 2 * 3 = 6
返回数组 [24,12,8,6]
3、解决方法
(1)方法1
知识点:如果不加上abs方法多话,实际效果会返回-0,为了和输出效果一样,还是加上了。js中 -0 === 0,其实都一样。
JavaScript 使用 IEEE 754 标准来表示数字,这个标准允许 0 有一个正的和负的表示。
let nums = [-1,1,0,-3,3]
var productExceptSelf = function(nums) {// 1: 定义一个返回效果的新数组let arr = [];// 2; 遍历nums数组nums.forEach((item, index) => {// 3-1:浅拷贝原数组为newArraylet newArray = [...nums];// 3-2: 根据当前的下标获取除自身外的所有数组的值newArray.splice(index,1);// 4: 定义一个获取乘积初始值为1的值sum(如果是相加就为0)let sum = 1 // 注意: sum不为1会影响最终结果,1乘以任何数都等于其本身// 5:将第三步截取除去当前数据本身的所有数组进行遍历,获取乘积for(let i = 0; i< newArray.length ; i++) {// 8:使用abs方法添加绝对值,如果不加的话会导致示例二出现-0的情况// 这玩意我还特的搜索了一下:js中 -0 === 0,其实都一样// JavaScript 使用 IEEE 754 标准来表示数字,这个标准允许 0 有一个正的和负的表示。sum = Math.abs(sum * newArray[i]) }// 6:将相乘后的数据添加到数组中arr.push(sum);});// 7: 返回数组console.log('arr', arr);
};
productExceptSelf(nums)
总结
(1)难度: 中等
(2)思路:通过splice截取获取除当前下标的每一项的数组,如[1,2,3,4]第一次获取[2,3,4],之后通过遍历获取乘积插入新数组。