题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
题解:
- 方法一:双重循环。
function multiply(array)
{
// write code here
let arrB = [];
for(let i=0;i<array.length;i++){
temp = array[i];
array[i] = 1;
multiB = 1;
for(let j=0;j<array.length;j++){
multiB *= array[j];
}
arrB.push(multiB);
array[i] = temp;
}
return arrB;
}
- 方法二:
可以把B[i]=A[0]A[1]…A[i-1]A[i+1]…A[n-1]。看成A[0]A[1]…A[i-1]和A[i+1]…A[n-2]A[n-1]两部分的乘积。
即通过A[i]项将B[i]分为两部分的乘积。效果相当于是个对角矩阵。
第一个for循环用来计算上图1范围的数,第二个for循环用来计算上图2范围的数。
function multiply(array)
{
// write code here
let arrB = [1];
let len = array.length;
for(let i = 1;i < len; i++){
arrB[i] = arrB[i-1] *array[i-1];
}
let temp = 1;
for(let j = len-2; j>=0 ;j--){
temp *= array[j+1];
arrB[j] *= temp;
}
return arrB;
}