解题思路
可能常规的思路是,我先把总的乘积算出来,然后用一个数组存当前索引左边的乘积,再次遍历的时候用总的乘积除左边的乘积就ok了,但是这样,如果数组中任何一个元素是0,所有结果就完了
思路:
- 从左到右遍历构建当前元素之前的的左边的所有乘积
2. 从右向左遍历,用一个变量来存当前元素右边元素的所有乘积
3. 当前结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积
var constructArr = function (a) {
let n = a.length;
// 非空判定
if (!n) return [];
// 结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积
let result = new Array(n).fill(1);
let rightAccu = 1;
for (let i = 1; i < n; i++) {
// 构建左边的乘积并保存在结果集中
result[i] = result[i - 1] * a[i - 1];
}
for (let i = n - 2; i >= 0; i--) {
// 构建右边乘积,以a = [1, 2, 3, 4, 5]举例,这里的temp会分别等于5、20、60、120
rightAccu *= a[i + 1];
// 乘以左边的乘积
result[i] *= rightAccu;
}
return result;
};