您的位置:首页 > 职场人生

面试题52:构建乘积数组

2015-05-03 10:00 330 查看
题目:给定一个数组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[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],分为两部分C[i]=A[0]*A[1]*...*A[i-1]和D[i]=A[i+1]*...*A[n-1],B[i]=C[i]*D[i],其中C[i]=C[i-1]*A[i-1],D[i]=D[i+1]*A[i+1]

例如:A[]={1,2,3}求B[]

B[0]=A[1]*A[2]=2*3=6

B[1]=A[0]*A[2]=1*3=3

B[2]=A[0]*A[1]=1*2=2

1.B[0]初始化为1,从下标i=1开始,先求出C[i]的值并放入B[i],即B[i]=C[i]=C[i-1]*A[i-1],所以B[1]=B[1-1]*A[1-1]=B[0]*A[0]=1*1=1,i++

2.B[2]=B[2-1]*A[2-1]=B[1]*A[1]=1*2=2,i++超出长度停止循环

3.C[i]计算完毕求D[i],设置一个临时变量temp初始化为1

4.从后往前变量数组,LengthA=3初始化i=LengthA-2=1,结束条件为i>=0

5.第一次循环,temp=temp*A[i+1]=1*A[2]=3,计算出A中最后一个元素的值放入temp,temp相当于D[i]的值

6.因为之前的B[i]=C[i],所以让B[i]*D[i]就是要保存的结果,即B[i]=B[1]=B[1]*temp=1*3=3,i--=0

7.计算B[i]=B[0],temp上一步中的值是A[2],在这次循环中temp=temp*A[0+1]=A[2]*A[1]=3*2=6

8.B[i]=B[0]=B0]*temp=1*6=6,i--<0循环结束

所以B数组为{6,3,2}

#include <iostream>
#include <vector>
using namespace std;

void multiply(const vector<double>& array1,vector<double> & array2)
{
int length1=array1.size();
int length2=array2.size();
if(length1==length2&&length2>1)
{
array2[0]=1;
for(int i=1;i<length1;i++)
{
array2[i]=array2[i-1]*array1[i-1];
}

double temp=1;
for(int j=length1-2;j>=0;j--)
{
temp*=array1[j+1];
array2[j]*=temp;
}
}
}

int main()
{
vector<double> a1;
a1.push_back(1);//在末尾插入元素
a1.push_back(2);
a1.push_back(3);

vector<double> a2;
a2.push_back(0);
a2.push_back(0);
a2.push_back(0);
multiply(a1,a2);

vector<double>::iterator it;
//遍历vector
for(it=a2.begin();it!=a2.end();it++)
cout<<*it<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: