Z 谷歌(Google)演算法面試題

2021-09-08 08:57:04 字數 3006 閱讀 9939

谷歌(google)演算法面試題

1.谷歌面試題:給定能隨機生成整數 1 到 5 的函式,寫出能隨機生成整數 1 到 7 的函式。

回答:此題的關鍵是讓生成的 1 到 7 的數出現概率相同。 只要我們可以從 n 個數中隨機選出 1 到 n 個數,反覆進行這種運算,直到剩下最後乙個數 即可。 我們可以呼叫 n 次給定函式,生成 n 個 1 到 5 之間的隨機數,選取最大數所在位置即 可滿足以上要求。 例如 初始的 7 個數[1,2,3,4,5,6,7]. 7 個 1 到 5 的隨機數[5,3,1,4,2,5,5] 那麼我們保留下[1,6,7], 3 個 1 到 5 的隨機數[2,4,1] 那麼我們保留下[6] 6 就是我們這次生成的隨機數。

2. 谷歌面試題:判斷乙個自然數是否是某個數的平方。當然不能使用開方運算。

回答: 假設待判斷的數字是 n。

方法 1: 遍歷從 1 到 n 的數字,求取平方並和 n 進行比較。 如果平方小於 n,則繼續遍歷;如果等於 n,則成功退出;如果大於 n,則失敗退出。 複雜度為 o(n^0.5)。

方法 2: 使用二分查詢法,對 1 到 n 之間的數字進行判斷。 複雜度為 o(logn)。

方法 3: 由於 (n+1)^2 =n^2+2n+1, =... =1+(2*1+1)+(2*2+1)+...+(2*n+1) 注意到這些項構成了等差數列(每項之間相差 2) 。 所以我們可以比較 n-1,n-1-3,n-1-3-5...和 0 的關係。 如果大於 0,則繼續減;如果等於 0,則成功退出;如果小於 0,則失敗退出。 複雜度為 o(n^0.5)。不過方法 3 中利用加減法替換掉了方法 1 中的乘法,所以速度會更 快些。

3. 谷歌面試題:給定乙個資料流,其中包含無窮盡的搜尋關鍵字(比如,人們在谷歌搜尋時不斷輸入的關鍵字) 。如何才能從這個無窮盡的流中隨機的選取 1000 個關鍵字?

回答:定義長度為 1000 的陣列。 對於資料流中的前 1000 個關鍵字,顯然都要放到陣列中。 對於資料流中的的第 n(n>1000)個關鍵字,我們知道這個關鍵字被隨機選中的概率為 1000/n。所以我們以 1000/n 的概率用這個關鍵字去替換陣列中的隨機乙個。這樣就可以保 證所有關鍵字都以 1000/n 的概率被選中。 對於後面的關鍵字都進行這樣的處理,這樣我們就可以保證陣列中總是儲存著 1000 個 隨機關鍵字。

4. 谷歌面試題:將下列表示式按照複雜度排序 2^n n^googol(其中 googol=10^100) n! n^n

回答: 按照複雜度從低到高為 n^googol 2^n n! n^n

5. 谷歌面試題:在半徑為 1 的圓中隨機選取一點。

回答: 假設圓心所在位置為座標元點(0,0)。

方法 1. 在 x 軸[-1,1],y 軸[-1,1]的正方形內隨機選取一點。然後判斷此點是否在圓內(通過計算 此點到圓心的距離) 。如果在圓內,則此點即為所求;如果不在,則重新選取直到找到為止。 正方形的面積為 4,圓的面積為 pi,所以正方形內的隨機點在圓內的概率是 pi/4。

方法 2. 從[0,2*pi)中隨機選乙個角度,對應於圓中的一條半徑,然後在此半徑上選乙個點。但 半徑上的點不能均勻選取, 選取的概率應該和距圓心的長度成正比, 這樣才能保證隨機點在 圓內是均勻分布的。

6. 谷歌面試題:給定乙個未知長度的整數流,如何隨機選取乙個數

回答: 方法 1. 將整個整數流儲存到乙個陣列中,然後再隨機選取。如果整數流很長,無法儲存下來,則此方法不能使用。

方法 2. 如果整數流在第乙個數後結束,則我們必定會選第乙個數作為隨機數。 如果整數流在第二個數後結束,我們選第二個數的概率為 1/2。我們以 1/2 的概率用第 2 個數替換前面選的隨機數,得到滿足條件的新隨機數。 .... 如果整數流在第 n 個數後結束,我們選第 n 個數的概率為 1/n。我們以 1/n 的概率用第 n 個數替換前面選的隨機數,得到滿足條件的新隨機數。 .... 利用這種方法,我們只需儲存乙個隨機數,和迄今整數流的長度即可。所以可以處理任 意長的整數流。

7.谷歌面試題:設計乙個資料結構,其中包含兩個函式,1.插入乙個數字,2.獲得中數。並估計時間複雜度。

回答: 1).使用陣列儲存。 插入數字時,在 o(1)時間內將該數字插入到陣列最後。 獲取中數時,在 o(n)時間內找到中數。 (選陣列的第乙個數和其它數比較,並根據比較 結果的大小分成兩組, 那麼我們可以確定中數在哪組中。 然後對那一組按照同樣的方法進一 步細分,直到找到中數。 )

2).使用排序陣列儲存。 插入數字時,在 o(logn)時間內找到要插入的位置,在 o(n)時間裡移動元素並將新數字 插入到合適的位置。獲得中數時,在 o(1)複雜度內找到中數。

3).使用大根堆和小根堆儲存。 使用大根堆儲存較小的一半數字,使用小根堆儲存較大的一半數字。 插入數字時,在 o(logn)時間內將該數字插入到對應的堆當中,並適當移動根節點以保 持兩個堆數字相等(或相差 1) 。 獲取中數時,在 o(1)時間內找到中數。

8. 谷歌面試題:在乙個特殊陣列中進行查詢,給定乙個固定長度的陣列,將遞增整數序列寫入這個陣列。當寫到陣列尾部時,返回陣列開始重新寫,並覆蓋先前寫過的數。 請在這個特殊陣列中找出給定的整數。

回答: 假設陣列為 a[0,1,...,n-1]。 我們可以採用類似二分查詢的策略。 首先比較 a[0]和 a[n/2],如果 a[0] 然後判斷要找的整數是否在遞增子串行範圍內。如果在,則使用普通的二分查詢方法繼 續查詢;如果不在,則重複上面的查詢過程,直到找到或者失敗為止。

9. 谷歌面試題:1024!末尾有多少個 0?

答案:末尾 0 的個數取決於乘法中因子 2 和 5 的個數。顯然乘法中因子 2 的個數大於 5 的個數,所以我們只需統計因子 5 的個數。 是 5 的倍數的數有:1024/5=204 個 是 25 的倍數的數有:1024/25=40 個 是 125 的倍數的數有:1024/125=8 個 是 625 的倍數的數有:1024/625=1 個 所以 1024!中總共有 204+40+8+1=253 個因子 5。 也就是說 1024!末尾有 253 個 0。

谷歌面試題

這個所謂的面試沒有物理存在,只是邏輯上等同於。題目要求如下 整數序列q中的每個元素都至少能被整數a和b中的乙個整除,現給定a和b,請計算出q中的前n項元素。例如,當a 3,b 5,n 6時,q序列的前6項元素為3,5,6,9,10,12。1 設計函式void generate int a int b...

谷歌面試題

某獵頭收集了140多個google的面試題,都張到他的blog中了,主要是下面這些職位的,因為被牆,且無任何敏感資訊,所以,我原文搬過來了。這篇blog例舉了google用來面試下面這幾個職位的面試題。很多不是很容易回答,不過都比較經典與 是google,microsoft,amazon之類的公司的...

Google 的面試題

一輛學校班車裡面能裝多少個高爾夫球?你被縮小到只有硬幣厚度那麼點高 不是壓扁,是按比例縮小 然後被扔到乙個空的玻璃攪拌器中,攪拌刀片一分鐘後就開始轉動。你怎麼辦?要是讓你清洗整個西雅圖的所有窗子,你會收取多少費用?怎麼才能識別出電腦的記憶體堆疊是向上溢位還是向下溢位?你要向你8歲的侄子解釋什麼是資料...