一道笔试题(构造数组)

    进园子很久了,一直在看大家写的博客,感觉收获很多,而自己一直惭愧才疏学浅,不敢造次。 不过老是索取而不付出总归是不道德。所以从今天起写些自己一直以来积攒的些许知识。如果能对大家有所帮助那是再好不过了。

    数组a[N]={a0,a1,a2....,an-1}  要构造数组b[N] 其中 b[i]=a[0]*a[1]*.....*a[N-1]/a[i]。要求是从了迭代器之外不能使用任何栈、堆、或静态变量

    想必很多人都知道这是哪家公司的笔试题吧。废话不说直接上代码。欢迎大家啪砖

View Code
#include <iostream>
#include <algorithm>
using namespace std;
#define  N 10
template<class T>
void print(const T &tmp)
{
    cout<<tmp<<"\t";
}
int main()
{
    int a[N]={1,2,3,4,5,6,7,8,9,10};
    int b[N]={0};
    b[0]=1;
    b[1]=a[0];
    //让 b[0]~b[N/2-1]中的b[i]全部成为  a[0]*a[1]*....a[i-1]
    for (int i=2;i<N/2;i++)
    {
        b[i]=b[i-1]*a[i-1];
    }
    //这里b[N/2]=a[N/2]*a[N/2+1]*...a[N-1]只是为了方便计算
    b[N/2]=1;
    for (int j=N/2;j<N;j++)
    {
        b[N/2]*=a[j];
    }
    //将b[N/2]~b[N-1]中的b[i]变成  a[N-i]*a[N-i-1]*...a[N-1]
    for (int m=N/2+1;m<N;m++)
    {
        b[m]=b[m-1]*a[N-m];
    }
    //这样就求出了前半部分
    for (int n=0;n<N/2;n++)
    {
        b[n]*=b[N-n-1];
    }

    //后半部分由于b[N]前半部分已经固定不能再动了,所以采用下面的方式
    //先让b[N/2]~b[N-1]满足它们的右边部分
    //即  b[i]=a[i+1]*a[i+2]*....a[N-1];  当然得从右向左进行
    //然后b[N/2]=a[0]*a[1]*....a[N/2-1];
    // b[i]=b[N/2]*b[i];  b[N/2]*=a[i];  从左向右进行
    b[N/2]=1;
    for (int jj=0;jj<=N/2;jj++)
    {
        b[N/2]*=a[jj];
    }
    //构造b[N/2]~b[N-1]部分
    b[N-1]=1;
    for (int mm=N-2;mm>N/2;mm--)
    {
        b[mm]=b[mm+1]*a[mm+1];
    }
    //构造真正的b[N/2]~b[N-1]部分
    for (int nn=N/2+1;nn<N;nn++)
    { 
        b[nn]=b[N/2]*b[nn];
        b[N/2]*=a[nn];
    }
    b[N/2]=1;
    //由于b[N/2]一直再变,所以最好还得求真正的b[N/2]
    for (int p=0;p<N;p++)
    {
        if (p==N/2)
            continue;
        b[N/2]*=a[p]; 
    }

    //打印
    for_each(b,b+N,print<int>);
    system("pause");
    return 0;
}

    后来又想了想。前后两部分也可以一样:  设置   b[N/2-1]=a[N/2]*a[N/2+1]*...*a[N-1]    b[N/2]=a[0]*a[1]*...a[N/2-1]

    然后按照求b[N]后半部分的方法,一起求出来,最后分别把 b[N/2-1]和b[N/2] 求出来

   

posted on 2013-04-22 17:58  SandyNie  阅读(123)  评论(0编辑  收藏  举报

导航