zoukankan      html  css  js  c++  java
  • 给定一个数组a[N],我们希望构造数组b[N]。。(2013腾讯实习生笔试题)

    题目:给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
    在构造过程:不允许使用除法;
    要求:O(1)空间复杂度和O(n)时间复杂度;
    除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
    请用程序实现并简单描述。

    方法一:首先进行一次迭代:
    i:1-n-1
    b[i]=b[i-1]*a[i-1];
    这样下去就是:
    b[1] = a[0]
    b[2] = a[0]a[1]

    b[i] = a[0]a[1]a[2]…a[i-1]

    b[n-1] = a[0]a[1]…a[n-2]

    b[i] = a[0]a[1]a[2]…a[i-1]

    b[n-1] = a[0]a[1]…a[n-2]

    然后进行二次迭代。。通过不断扩展b[0],来实现数组转换

    通过b[0]这个变量来迭代出1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],迭代过程中分别乘以b[n-1], b[n-2], … , b[0]

    代码:

    void Translate(int a[], int b[], int n)
    {
        b[0] = 1;
        for (int i = 1; i <= n-1; i++)
        {
            b[i] = b[i-1]*a[i-1];
        }
    
        for (int i = n-1; i >= 1; i--)
        {
            b[i] *= b[0];
            b[0] *= a[i];
        }
    }

    方法二:

    //方法二,保持a数组不变
    void makeArray(int a[],int b[],int len)
    {
        int i;
        b[0] = 1;
        for(i = 1 ; i < len ; ++i)
        {
            b[0] *= a[i-1];
            b[i] = b[0];      // b[i] = a[0]*a[1]*...*a[i-1]
        }
        b[0] = 1;
        for(i = len - 2 ; i > 0 ; --i)
        {
            b[0] *= a[i+1];   // b[0] = a[i+1]*a[i+2]...*a[len-1]
            b[i] *= b[0];     // b[i] = a[0]*a[1]*...*a[i-1]*a[i+1]*...*a[len-1]
        }
        b[0] *= a[1]; 
    
    }

    方法三:

    /*
    思路:进行3趟扫描
    第一趟从左到右对A进行累乘,结果保存在B数组中,b[i] = b[i-1]*a[i-1];
    第二趟从右到左对A进行累乘,结果写入A中,a[i]=a[i+1]*a[i];
    第三趟从左到右,然后B数组对应位置的元素等于其前一个位置的元素与A中其后一个位置的元素的乘积。b[i] = a[i+1] * b[i-1]
    */
    void makeArray(int a[],int b[],int len)
    {
        int i;
        b[0] = 1;
        for(i = 1 ; i < len ; ++i)
            b[i] = b[i-1] * a[i-1];    // b[0] = 1 , b[i] = a[0]*a[1]*...*a[i-1]
    
        a[len - 1] = a[len - 1]^a[len - 2];   //不使用中间变量,通过位运算来交换两个变量
        a[len - 2] = a[len - 1]^a[len - 2];
        a[len - 1] = a[len - 1]^a[len - 2];
    
        for(i = len - 3 ; i >= 0 ; --i)
        {
            a[len - 1] = a[i + 1] * a[len - 1];
    
            a[i] = a[i]^a[len - 1];    //交换两个变量
            a[len - 1] = a[i]^a[len - 1];
            a[i] = a[i]^a[len - 1];
        }
        a[len - 1 ] = 1;    //a[len - 1 ] = 1 , a[i] = a[i+1]*a[i+2]*...*a[len-1]
    
        for(i = 0 ; i < len ; ++i)
            b[i] = a[i] * b[i];
    }
  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/sooner/p/3036448.html
Copyright © 2011-2022 走看看