google面试
.谷歌面試題:給定能隨機生成整數 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。
總結
- 上一篇: 抛硬币 直到连续出现两次字为止
- 下一篇: STL_Hash_map