题目
给定一个数组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]。不能使用除法。对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
分析
本题的意思就是B数组对应位置元素为A数组除该位置之外所有元素的乘积。有不能使用除法,所以采用两次遍历进行计算B数组的值。B数组初始化为1,第一步是从左到右遍历,B[i] = B[i-1] * A[i-1]。第二次遍历,tmp=1,从右往左遍历,tmp *= A[i+1],B[i] *= tmp。
github链接: JZ51-构建乘积数组
C++代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
vector<int> B(A.size(),1);
for(int i = 1 ; i < A.size() ; i++){
B[i] = B[i-1]*A[i-1];
}
int tmp = 1;
for(int i = A.size()-2 ; i >= 0 ; i--){
tmp *= A[i+1];
B[i] *= tmp;
}
return B;
}
};
int main()
{
int n;
Solution s;
while(cin>>n){
vector<int> A(n);
for(int i = 0 ; i < n ; i++){
cin>>A[i];
}
vector<int> B = s.multiply(A);
for(int i = 0 ; i < B.size() ; i++){
cout<<B[i]<<" ";
}
}
return 0;
}