题解 | #构建乘积数组#
构建乘积数组
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; }