最近很忙,是在木有時間上來寫技術部落格了。人又變懶了啊~
今天抽點時間,上來討論一道google的面試題吧~
題目是:給你乙個陣列 a [ 1 .. n ] ,請你在 o ( n ) 的時間裡構造乙個新的陣列 b [ 1 .. n ] ,使得 b [ i ] = a [ 1 ] * a [ 2 ] * ... * a [ n ]/a [ i ] 。你不能使用除法運算。
思路和解答:這一題實則很簡單。有過基本程式設計思維訓練的人都知道,降低時間複雜度,肯定會在空間上有所犧牲。並且,這種型別的題目,最重要的就是要避免重複計算,即必須用額外的空間來儲存已經計算得到的記過。這點和尾遞迴的優化以及動態規劃思想有類似之處。
實際上,因為b [ i ] = a [ 1 ] * a [ 2 ] * ... * a [ n ]/a [ i ]
換一種寫法,即b [ i ] = a [ 1 ] * ... * a [ i - 1 ] * a [ i + 1 ] * ... * a [ n ]
可以看到上述式子分為兩個部分,前半部分是1到i-1的乘積,後者是i+1到n的乘積。
那麼我們就可以設定兩個陣列:
s [ i ] = a [ 1 ] * ... * a [ i – 1 ]
t [ i ] = a [ i + 1 ] * ... * a [ n ]
容易看到
s [ i ] = s [ i-1 ] * a [ i-1 ]
t [ i ] = t [ i + 1 ] * a [ i+1 ]
構造這兩個陣列所化的時間為o ( 2n )。
其中s是從前往後累乘構造,t是從後往前累乘構造。
之後利用b [ i ] = s [ i ] * t [ i ] ( 2 <= i <= n-1),陣列對應的數相乘即可。
實際編碼過程中需注意
b [ 1 ] = t [ 1 ];
b [ n ] = s [ n ];
可以分別在t陣列和s陣列的開頭和結尾增補乙個資料,即s [1] = 1. t[ n ] = 1
這時,b [ i ] = s [ i ] * t [ i ] ( 1 <= i <= n),
時間複雜度退化為線性,但空間也增至o( 3n )。
以上便是全部解答,希望有幫助!
一道Google面試題
問題如下 下面的數字是按照一定規律排列的,請問最後一排應該填入哪些數字?111 1121 122111 以下解答案摘自網上 外觀數列 為依照外觀產生下一列的數列,第一列為 1 第二列描述第一列 1 個1 而為 11 第三列則描述第二列 2 個1 而為 21 第四列 1211 依此類推。將原本由左而右...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...