給定一個數組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];
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM