某筆試附加題解法


剛進博客園就在《一道面試附加題的另類求解》看到一道有趣的題,正好,偶對這題也有一些想法,因此寫來分享下。題目如下:

先來看第一個條件,不可用除法。要滿足這個條件倒是很簡單:

令forward[i] = a[0] * a[1] *... * a[i];

   backward[i] = a[i] * a[i+1] *...* a[N];

那么b[i] = forward[i-1] * backward[i+1];

 

在此基礎上,我們再來看一下第2個條件,時間復雜度為0(N),空間復雜度為O(1)。

先將forward和backward數組的值算出,然后才算b數組的值雖然可以滿足時間的要求,但空間要求卻滿足不了。因此有必要減少空間的使用量。仔細地觀察forward數組,就會發現這個數組可以用一個變量代替。而backward數組的每個元素只使用一次,並且是按順序使用的。那么如果將backward數組的值放到b組中,不就可以解決這個問題了。具體代碼如下:

int Zero(int a[], int b[], int N) {
int i;

b[N - 1] = a [N - 1];
for(i = N - 2; i >= 0; --i) { //construct backward array in b array
b[i] = b[i + 1] * a[i];
}

int forward = 1;
for(i = 0; i < N - 1; ++i) {
b[i] = forward * b[i + 1];
forward *= a[i];
}
b[N - 1] = forward;
}

 

現在只剩下第三個條件——只能使用遍歷變量的限制了。上面的方法只要去掉forward這個局部變量就滿足全部條件。在思考怎樣去掉之前,不防回顧前面是怎樣去掉backward數組的。沒錯,利用了b數組暫時沒用到的性質。那么去掉forward的方法也可以如法炮制。

void Zero(int a[], int b[], int N) {
int i;

b[N - 1] = a [N - 1];
for(i = N - 2; i >= 0; --i) { //construct backward array in b array
b[i] = b[i + 1] * a[i];
}

b[N - 1] = 1; //use as forward
for(i = 0; i < N - 2; ++i) {
b[i] = b[N - 1] * b[i + 1];
b[N - 1] *= a[i];
}
b[N - 2] = b[N - 1] * a[N - 1];
b[N - 1] = b[N - 1] * a[N - 2];
}

 

一點思考:

      就通常來說,編程是主張一物一用,一個函數最好只完成一個功能,即一個物體不要同時用於多個用途。因為這樣的代碼易於閱讀和維護。但是卻有不能這樣做的時候,例如本題,例如在一台普通PC上處理大數據。在這樣的時候,只能打破這些約束了。因為如果功能都完成不了,還談什么閱讀與維護。



 


免責聲明!

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



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