想去Google做AI?面試題在手,全程無憂!
作者 | 阿司匹林
出品 | 人工智慧頭條(公眾號ID:AI_Thinker)
憑藉強大的技術實力和良好的工作氛圍,Google 對求職者一直有著強大吸引力。
雖然 Google 在幾年前就已經退出了中國大陸市場,但是在北京、上海等國內城市依然保留著辦公地點,而且一直在對外發布招聘需求。特別是去年底,Google 宣佈在北京成立 AI 中心,更是為中國的 AI 人才提供了又一個好去處。
為此,我們整理一份 Google 面試指南,並蒐集了 20 道 Google AI 的面試問題,希望對感興趣的讀者能有所助益。
當然,如果你想申請國外的 Google 崗位,這份資料也同樣適用。
▌Google 面試方式
首先,Google 為求職者提供兩種面試方式,一種是電話面試或者通過 Google Hangout 進行面試,一種是現場面試,面試方式視情況而定。
電話面試
在電話面試或者 Google Hangout 面試中,面試官將會是你潛在的同事或者經理。
如果你面試的是軟體工程崗位,那麼面試時間將持續 30~60 分鐘。在回答程式設計問題時,你需要一邊在 Google Doc 裡面寫程式碼,一邊告訴面試官你的思考過程。我們建議你使用擴音耳機或者揚聲器,以便騰出手來打字。
電話面試的內容包含資料結構和演算法,你需要做好準備,用你最擅長的語言編寫 20~30 行程式碼。
面試官會提一個開放式的問題,你可以讓面試官將問題解釋清楚。
你需要用演算法來解釋它。
用程式碼來實現演算法(提示:不要擔心不夠完美,因為時間有限。先將你想到的寫下來,然後再完善,確保考慮到了 corner case 和 edge case)。
優化程式碼,用案例來測試程式碼,然後找出所有的 bug。
如果你申請的是其他職位,那麼電話面試時間大約為 30~45 分鐘。
面採
面試官通常有 4 位,包括潛在的同事以及一些跨職能的員工,每位面試官擁有 30~45 分鐘的時間。作為求職者,你有機會表現你在以下四個不同領域的優勢:
一般認知能力:我們會問一些開放式的問題來了解你是如何處理和解決問題的。這些問題沒有固定的正確答案,我們更看重解釋思考過程的能力以及使用資料來指導決策的能力。
領導力:說明你是如何使用自己的溝通和決策技巧來調動他人的。比如,你是如何在某個組織中晉升到領導職位的?或者在不是正式領導的情況下,你是如何幫助團隊取得成功的?
與職位相關的知識:我們感興趣的是,你如何將你的個人優勢與經驗相結合,從而發揮影響力的。我們關注的不僅僅是你現在能做些什麼,而是你未來在不同崗位上的發展潛力。
“谷歌範兒”(Googleyness):你在單獨工作或者團隊協作時的工作方式?你是如何幫助他人的?你是如何駕馭不確定性情況的?又如何走出舒適區,讓自己成長的?
對於軟體工程師候選人,我們希望瞭解你的程式設計技能和技術領域專業知識,包括程式設計工具、程式語言、以及資料結構和演算法基本知識。在面試過程中免不了會有一些討論,因為我們喜歡互相推動,學習不同的方法。因此,請你做好要深入討論你提出的解決方案的準備。打破自己的邊界,找到最優答案。
Google 的技術面採歷來用的是白板,但為了節省時間,同時提供更加真實的程式設計環境,我們已經開始在一些站點提供 Chromebook,用於程式設計面試。這些電腦上安裝了一個面試程式,你可以選擇自己偏好的語言。
在整個面試過程中,你可以隨時讓面試官作出解釋,確保自己完全理解面試官的問題。此外,你也可以“採訪”我們,問一些與工作、團隊、文化等相關的問題,幫助你決定這份工作是否適合自己。
▌Google 軟體工程和技術職位面試
如果你選擇的是軟體工程相關的崗位,在面試前你最好先掌握以下幾個方面的知識:
程式設計實踐:你可以在 CodeLab、Quora、Stack Overflow 等網站上找到一些程式設計示例。Cracking the Coding Interview 這本書也是一個不錯的資源。在某些站點,你可以選擇在 Chromebook 或者白板上程式設計(提前詢問招聘人員,這樣你可以先行練習)。一定要測試程式碼,確保程式碼易於閱讀,而且沒有 bug。不用過分關注細微的句法錯誤,比如在給定方法(start, end or start, length)時應該使用哪種 substring,選擇一個,告訴你的面試官即可。
程式設計:你應該熟練掌握至少一門程式語言,最好是 C++、Java、Python、Go 或者 C。你需要知道 API,面向物件的設計和程式設計,如何測試程式碼,以及 corner case 和 edge case。注意,我們關注的是你對概念的理解而不是記憶。
演算法:同時用自下而上的演算法和自上而下的演算法來處理問題。你需要了解演算法的複雜性以及如何改進演算法。Google 裡常用的包括排序演算法(加上搜索和二分法檢索)、分治演算法、動態程式設計/記憶、貪心演算法、遞迴演算法、連結到特定資料結構的演算法。瞭解大 O 符號(Big O notation,比如執行時),並做好討論 Dijkstra 和 A* 等複雜演算法的準備。我們建議你在寫程式碼之前討論或概述你所想到的演算法。
排序:熟悉常用的排序函式以及瞭解它們對哪些輸入資料有效。從執行時(runtime)和記憶體佔用的角度思考效率問題。例如,在特殊情況下,插入排序(insertion-sort)或基數排序(radix-sort )比一般的快速排序/合併排序/堆排序(QuickSort/MergeSort/HeapSort)答案好得多。
資料結構:你應該研究儘可能多的資料結構。最常用的資料結構有陣列、連結串列、堆疊、佇列、雜湊集、雜湊對映、雜湊表、字典、樹和二叉樹、堆和圖( arrays, linked lists, stacks, queues, hash-sets, hash-maps, hash-tables, dictionary, trees and binary trees, heaps and graphs)。你需要徹底瞭解資料結構,以及不同演算法對不同資料結構的偏好。
數學:有些面試官會問一些基本的離散數學問題,因為我們經常碰到各種計算問題、概率問題、以及其他的 Discrete Math 101 問題。面試前,你可以花時間複習下(或者自學)基本概率論和組合數學的基本知識。你需要熟悉 n-choose-k 等同型別的問題。
圖演算法:考慮一個問題是否可以應用圖演算法,如距離,搜尋,連線,迴圈檢測等(distance, search, connectivity, cycle-detection)。熟悉三種基本方法——物件和指標,矩陣和鄰接表——的利弊。瞭解基本的圖遍歷演算法、廣度優先搜尋和深度優先搜尋,以及它們的計算複雜性、優缺點、實現方法。
遞迴:許多編碼問題都涉及遞迴思考,而且可能還要對遞迴解決方案進行編碼。針對那些能夠用迭代解決的問題,你需要找到更簡練、更優雅的遞迴方法。
▌Google AI 職位面試
如果你應聘的是 AI 相關的職位,那麼你最好先對 Google 的 AI 有一個全面的瞭解。
首先,Google AI 文章數量最多的三個領域為:
其次,下面的內容需要你重點閱讀:
在對 Google AI 有了比較全面的瞭解後,你就可以看一下這份由眾多求職者分享的 Google AI 相關的面試問題了。
- 1/x 的導數是什麼?
- 繪製 log(x+10) 函式的曲線。
- 如何設計一個 針對客戶滿意度的調查?
- 投擲一枚硬幣 10 次,8次正面和 2 次反面。如何分析擲硬幣的公平性?什麼是 p-value?
- 你有 10 枚硬幣,每枚硬幣擲 10 次(共 100次),並觀察結果,你會修改演算法來測試硬擲硬幣是否公平嗎?
- 解釋一個非正態分佈以及如何應用它?
- 為什麼要使用特徵選擇?如果兩個預測因子高度相關,那麼對邏輯迴歸中的係數有什麼影響? 係數的置信區間是多少?
- K-Means演算法和高斯混合模型:K-Means 演算法和 EM 演算法之間有什麼區別?
- 高斯混合模型適用於什麼情況?(正態分佈)
- 如果標籤在聚類專案中是已知的,那麼如何評估模型的效能?
- 對一個 Google 應用程式做了更改之後,如何測試某個指標是提高了還是降低了?
- 描述資料分析的過程。
- 為什麼不使用邏輯迴歸演算法?為什麼選擇 GBM 演算法?
- 推導 GMM 方程?
- 如何衡量使用者對視訊的喜好程度?
- 模擬一個二元正態分佈?
- 推導一個分佈的方差?
- 每年有多少人申請 Google 賬戶?
- 如何構建中位數的估計量?
- 如果迴歸模型中的兩個係數估計值都具有統計顯著性,那麼你是否認為兩者的測試依然重要?
最後,歡迎大家在評論區分享自己的答案以及面試經驗。
掃描二維碼,和大家一起參加 #TinyMind 性別年齡預測 #競賽