google面試題一道

2022-09-05 09:39:12 字數 1103 閱讀 1884

最近很忙,是在木有時間上來寫技術部落格了。人又變懶了啊~

今天抽點時間,上來討論一道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 遍歷這...