• 给定一个数组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];
    }
  • 相关阅读:
    分频
    加法器
    The best season is around you
    电影词汇
    DSP芯片和所有微处理器一样,以2的补码形式表示有符号数。
    乔布斯给妻子的结婚20周年情书
    webapp 处理表单
    看过戴旭之《中国面临被肢解的命运》之后
    转我在敏捷中国Open Space上发起的讨论主题——如何激励,用绩效考核吗?
    转QA不是QC,兼谈Lean、Kanban和TDD(上)
  • 原文地址:https://www.cnblogs.com/sooner/p/3036448.html
Copyright © 2020-2023  润新知