题解 | #构建乘积数组#
构建乘积数组
https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46
function multiply(array)
{
// 构建两个数组,一个表示array从左到右累乘的结果,另一个表示array从右到左累乘的结果,
// 两个累乘结果数组从起始位各自错开一位,起始位用 1 填充。
// 举例来说,从左到右的结果数组中,第三个数字表示的是array中前两个数累乘的结果,
// 第五个数字表示的是array中前四个数字累乘的结果,
// 从右到左的结果数组中,倒数第三个数字表示的是array中后两个数累乘的结果,
// 倒数第七个数字表示的是array中后六个数字累乘的结果。。。。。。
// 这两个数组构建完成之后,构建一个新数组,它各个位置的值等于两个数组对应位置的值相乘,
// 这样一来新数组中存储的就是array去除对应位置数字之后其他数字的累乘结果。
// 举例来说,新数组共有八个数字,它的第三位是从左到右和从右到左两个数组中各自第三位的乘积,
// 而这两个数字分别代表了array前两个数累乘以及array后五个数累乘,恰好没有包括第三个数。
let LtoR = [array.length];
let RtoL = [array.length];
for (let i = 0; i < array.length; i++) {
if (i === 0) {
LtoR[i] = 1;
} else {
LtoR[i] = LtoR[i - 1] * array[i - 1];
}
}
for (let i = array.length - 1 ; i >= 0 ; i--) {
if (i === array.length - 1) {
RtoL[i] = 1;
} else {
RtoL[i] = RtoL[i + 1] * array[i + 1];
}
}
let result = [];
for (let k = 0; k < array.length; k++) {
result[k] = RtoL[k] * LtoR[k];
}
return result;
}
JavaScript特供版
function multiply(array) {
let LtoR = [];
let RtoL = [];
for (let i = 0; i < array.length; i++) {
if (i === 0) {
LtoR.push(1);
} else {
LtoR.push(LtoR[LtoR.length - 1] * array[i - 1]);
}
}
for (let i = array.length - 1; i >= 0; i--) {
if (i === array.length - 1) {
RtoL.push(1);
} else {
RtoL.unshift(RtoL[0] * array[i + 1]);
}
}
let result = [];
for (let k = 0; k < array.length; k++) {
result[k] = RtoL[k] * LtoR[k];
}
return result;
}

查看26道真题和解析