**
****题目:给定某无序数组,要求返回新数组 product,其中 product[i] 为原数组中除了下标为 i 的元素之外的元素乘积
**
思路一:将下标为i的元素删除,再把剩下元素的积放到i处
上代码:
var arr1 = [2, 2, 1, 3, 2];
var arr2 = [0, 2, 0, 2, 0];
var arr3 = [-2, 2, 2, -1, -2];
factory(arr1); // [12, 12, 24, 8, 12]
factory(arr2); // [0, 0, 0, 0, 0]
factory(arr3); // [8, -8, -8, 16, 8]
function factory(targetArr) {
var product = [];
var len = targetArr.length;
for (var i = 0; i < len; i++) {
var widget = 1;
//立即执行函数解决闭包问题
(function(j) {
//为避免改变原数组,在克隆的新数组上操作
var newArr = [];
for (var i = 0; i < len; i++) {
newArr[i] = targetArr[i];
}
//删除第i个元素
newArr.splice(j, 1);
//剩下元素求积
for (var i = 0; i < newArr.length; i++) {
widget *= newArr[i];
}
}(i))
//将积放在i处
product.push(widget);
}
console.log(product);
return product;
}
思路二: 用i前面的元素积,乘以i后面元素的积,再把最后结果放于i处
上代码:
var arr1 = [2, 2, 1, 3, 2];
var arr2 = [0, 2, 0, 2, 0];
var arr3 = [-2, 2, 2, -1, -2];
factory(arr1); // [12, 12, 24, 8, 12]
factory(arr2); // [0, 0, 0, 0, 0]
factory(arr3); // [8, -8, -8, 16, 8]
function factory(targetArr) {
var len = targetArr.length;
var product = [];
var widget = 1;
for (var i = 0; i < len; i++) {
//将目标数组当前索引之前的数之积保存到product数组中
product.push(widget);
widget *= targetArr[i];
}
//初始化widget值
widget = 1;
for (var i = len - 1; i >= 0; i--) {
//将当前索引前面数的积与后面的数相乘
product[i] *= widget;
widget *= targetArr[i];
}
console.log(product);
return product;
}