猿題庫唐巧談招聘 像翻轉二叉樹這種題目是一定要考的

jopen 10年前發布 | 45K 次閱讀 招聘

猿題庫唐巧談招聘 像翻轉二叉樹這種題目是一定要考的

事件回放

2015 年 6 月 10 日,Homebrew 的作者 @Max Howell 在 推ter 上發表了如下一內容:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.

事情大概是說,Max Howell 去 Google 面試,面試官說:雖然在 Google 有 90% 的工程師用你寫的 Homebrew,但是你居然不能在白板上寫出翻轉二叉樹的代碼,所以滾蛋吧。

這件事情如果發生在任何一個應屆生身上,那是再正常不過的了,但是偏偏面試者是有名的 Max Howell。于是乎,關于應該如何面試程序員,再一次被大家熱烈的討論。

我看了一下 Quora 和 Hacker News 上的討論,就此話題說說我的看法。

如何做這道題

在說招聘之前,我們先談談這道題應該怎么做吧。LeetCode 非常與時俱進地收錄了 這道題,我嘗試做了一下。由于 LeetCode 不支持用 Objective-C 或 Swift 寫,我只好用 Java 來寫,但是電腦里面沒有裝 Eclipse,所以我直接就在 LeetCode 編輯框里面提交了。

編譯錯了兩次,之后運行錯了一次,出現了 NullPointerException,于是想到沒有檢查指針為空,加上檢查之后,就通過了。下圖是提交記錄。

猿題庫唐巧談招聘 像翻轉二叉樹這種題目是一定要考的

除去 LeetCode 自動生成的注釋和方法定義,我所寫的整個代碼行數為 9 行,大概花了 5 分鐘時間。代碼如下所示:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode (int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode invertTree (TreeNode root) {
        if (root == null) {
            return null;
        }
        root.left = invertTree (root.left);
        root.right = invertTree (root.right);

        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        return root;
    }
}

那么這道題考查了什么呢?我覺得主要是考查了遞歸的思想。遞歸是程序設計的精髓,掌握了他可以將一個大問題分解成小問題,繼而求解。比如對于此題來說,反轉一個二叉樹其實就是:

  1. 反轉二叉樹的左右子樹
  2. 將左右子樹交換

而第 1 步又是一個反轉二叉樹的問題,所以就可以用遞歸來處理了。然后再考慮好遞歸的結束條件,這道題就可以解決了。

這是一道好的面試題嗎?

如果面試者是一個應屆生,我認為這是一道非常好的題目。因為應屆生剛剛學完學校的數據結構和算法知識,二叉樹和遞歸都是基本的知識,應該被掌握的。

如果面試者是一個有多年工作經驗的人,我認為這道題的難度其實不大,一個人即使多年不使用二叉樹,多年不使用遞歸,但是這種思考還是很容易想到的。當然,所花的時間可能會大一些。所以我并不認為這是一道難題。

但是,對于一個有工作經驗的人,考查他的工作內容,或許更有價值。因為相比代碼的邏輯思維能力來說,工作方式和解決問題態度,架構設計,設計模式都是更重要的考查點。

當我們面算法題的時候,我們在考查什么?

就像 Quora 上 提到的那樣,算法題面試被廣泛應用在各大頂級互聯網公司,包括 Google, 非死book, Microsoft, Amazon, Airbnb, Dropbox。在中國,這樣的情況同樣存在,BAT 的面試也充斥著算法題目。我當年在網易有道面試的時候,每一輪也都問了很多道算法題目。

但是,很多求職者都會問:“工作中用得到這些嗎?”,說實話,用得非常少。那么當我們面算法題的時候,我們到底在考查什么?就我的經驗來看,我們會從算法面試中考查到以下三點:

  1. 計算機的基礎知識。一個人基礎知識扎實,說明他在學校就很用功。
  2. 聰明程度。編程還是一個重智力的工作,智商高的人會在不停地知識更新中快速跟進學習。算法題其實就是計算機專業的智力測試題。這里面,動態規劃的算法題目由于變化多,體現得就特別明顯,考動態規劃其實就是測智力。
  3. 溝通能力和思維。面試算法題的時候,一般不會直接讓候選人寫代碼,而是會先一起討論。通過討論的過程,了解面試者溝通的能力和考慮問題的方式,也是考查的重點。

考查算法題會不會太片面?

是的,算法在工作中運用得比較少,一般人也不會在工作中專門積累解算法題的能力。所以通常做算法題最強的是應屆生,因為他們有時間去刷題。而在 實際工作中,很多能力,都比算法能力重要。比如對代碼的潔癖,對設計模式的理解,對計算機底層(操作系統、網絡)的理解,對待工作的態度等。

那么,為什么那么多公司不考查,或者不重點考查這些,而只是問算法題呢?

答案很簡單,因為要在幾個小時內了解一個人太難了。通常一場面試只有一個小時,如果要在一個小時內把上面說到的知識點都面面俱到的考查,是做不 到的。但是如果花幾天來考查,對于公司和求職者都是不可接受的。所以,很多大公司就用面算法題的方式來偷懶,因為這種方式雖然可能會誤傷很多優秀的人才, 但是不合格的人,要混進去還是相當困難的。

講一句不好聽的,很多公司在招聘的時候,首先根據學校,把非 985 的學校簡歷都過濾掉,也是一種不太合理,但是有效的方法。清華北大的人一定就牛逼嗎?不一定,但是從概率上講,比南翔技校的人通過面試的機會要高一些。所 以,為了提高面試效率和成本,就直接把一般學校的簡歷過濾掉,這是一個不人道,但是從經濟上合理的行為。

我自己也因為這個選拔方式深受打擊,我自認為還是非常優秀的,在學校時拿到過 ACM 國際大學生程序設計競賽的區域賽金牌,也在 IBM 實習過,學校專業課成績也很好,但是畢業那年我連 Google 的筆試資格都沒拿到。人家就在清華北大選人才,就足夠了。

我們應該怎么辦?

現有的面試方式,其實讓公司和候選者都不是太爽,主要的原因就是考查的時間太短,能夠參考的信息量太小。但是,隨著互聯網的發展,作為程序員,我們慢慢有了更多的方式來讓公司在面試前就了解自己。

我們可以搭建自己的博客,將自己的學習心得總結下來。我們可以將自己寫得好的代碼開源在 Github 上。我們可以在 stackoverflow 上回答問題,用 reputation 來證明自己的能力。我們還可以給著名的開源項目提 PR,成為重要的 Contributor。我們可以給 InfoQ 網站投稿。我們可以去 QCon 上分享技術。

如果你能在網絡上構建起自己的技術能力圖,那么對于很多公司來說,或許面試中偏技術性的考查就不那么重要了,面試的過程就可以更輕松愉快了。

但是,不要高興得太早,要做到上面提到的這些只會比做算法題更難。但是,至少我們可以讓自己的實習得到充分展示,能夠讓面試不那么片面,能夠讓公司更加全面的了解自己。

所以說最后,機會還是給那些努力的人。如果一個人學校不好,沒有做過什么大項目,在網上沒有任何可以考查的信息,那么面試的時候,估計等待他的還是各種算法題。

猿題庫是如何招聘的?

或許你會失望,我們其實就是和 Google 一樣,會問大量的算法題。即使你來自名校名企,但是不會翻轉二叉樹,我們肯定會把你拒掉。

對于有經驗的開發者,我們會適當降低算法題的難度,同時考查一些工作經歷,但是翻轉二叉樹這種難度的題目,是必須做出來的。

所以,如果你沒有各種社交網絡的資料證明自己的實力,那還是老老實實把基礎知識準備扎實吧。算法知識雖然用得少,但是在關鍵時候還是有用的,以后我會另外撰文舉例。

愿大家都能找到自己的伯樂~

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!