zoukankan      html  css  js  c++  java
  • 一道笔试题(构造数组)

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

        数组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] 求出来

       

  • 相关阅读:
    一些博客
    【iOS】得到当前年、月、周的第一天和最后一天
    iOS学习路线
    UI开发--响应者链条
    通知中心 NSNotificationCenter
    UITableView的编辑(插入、删除、移动)
    FMDatabaseQueue 如何保证线程安全
    理解 dispatch_get_specific
    instancetype
    【转】手把手教你ARC——iOS/Mac开发ARC入门和使用
  • 原文地址:https://www.cnblogs.com/sandynie/p/3036119.html
Copyright © 2011-2022 走看看