為什麼要學習資料結構和演算法?理由有很多,比如鍛鍊邏輯思維、寫**時候的複雜度思維、學會將資料結構和演算法應用到專案、提高閱讀開源**的能力等等,但是對於很多小夥伴來說,我們不得不承認,最務實的目的,最急切要解決的問題,是應付演算法面試,面試的時候不再懼怕被問到演算法問題。
不過,話說回來,面試中面演算法的公司並不多。喜歡面演算法的公司主要是些bat量級的大公司,但這些公司畢竟不多,而且,如果是社招,僅僅leetcode刷的好,也不能讓你進這些公司,因為畢竟他們還會看其他方面的東西,比如你的專案經驗、過往工作履歷等。而大部分中型公司、小型公司、a/b/c/d輪的創業型公司,都不怎麼會面試演算法。而且,如果你是畢業很多年的資深工程師,那更不大可能從基礎的演算法面起了。
說這些的主要目的並不是不推薦你刷題,而是要適度刷題,業餘時間偶爾刷刷,做到看到演算法問題不心虛就好了,不要把重心完全放到刷題上。多積累專案經驗,做好專案,才是職場發展的王道。
對於演算法面試,我當年校招的時候,算是演算法面霸,現在應該也是,不誇張地講,我遇到的大部分面試官的演算法能力可能都還沒有我強。對於演算法面試,我也有一些心得、經驗,可以分享給你。
所謂「題海戰術」,說白了就是oj刷題。刷題**有很多很多,主要分為兩類,一類就是類似leetcode這樣的,主要是為了面試,題目難度相對低一些,另一類就是各大高校的oj,比如北大的poj,主要針對acm競賽的訓練,題目難度要比前者高一些。
當年我刷題的時候,leetcode上才只有不到100道題目,所以,我當年主要在各大高校的oj上刷題,零零總總大約刷了1000道題目的樣子。現在leetcode上有上千道題目,已經是最流行的面試刷題**了。所以,如果你是為了應付面試,只刷leetcdoe就我覺得就夠了。
今天,我主要講一下,演算法面試中的一些小技巧,在你題目刷的差不多的時候,這些小技巧能幫助你面試現場更好地發揮。
在面試前,你要多搜下面經,看看要應聘的公司的面試題難易程度和面試官的喜好,有針對性的準備。比如有的公司喜歡面試動態規劃,面試前就去leetcode多刷下這類題目,有的公司的演算法面試比較簡單,面試前找簡單題目練一下就好了。當然,這個只是為了有個大概的了解,要想壓到題目還是很難的。因為很多公司,比如google,要求如果某個題目已經被洩露,堅決就不能再被使用。
我們平時都是在ide中寫**。ide本身有自動提示功能,而且可以隨意修改**。但是,在面試中,我們一般都是在白板或者紙上寫**。而在紙上寫**,對整潔度的要求很高,因為寫好之後就不好改了,不然改的亂七八糟,面試官會覺得你思路混亂。所以,在面試前,你要在紙上多練習一下,能夠做到腦袋裡想好演算法之後,能一氣呵成的寫出**。如果實在寫的太亂,寫完之後,再重新抄一遍。所以,去面試的時候,自己多準備幾張白紙,以免面試官給你的紙不夠用?。
實際上,演算法面試不僅僅考察你的演算法能力,還考察你的**能力。你的**是否能做到bug free這個非常關鍵。在面試中,如果你寫出來的**,bug很多,即便演算法正確,也不大可能被錄用。所以,在寫**的時候,你一定要注意非法輸入的判斷、一些特殊邊界情況的處理。在寫完**之後,你也要認真檢查一遍,並且用測試用例檢查一下你的**是否能執行正確。測試用例起碼要包含正常情況、錯誤情況、以及一些邊界情況(corner case)。
除了剛剛說的**要沒有bug之外,你還需要注意**規範,比如變數、函式的命名一定要規範,可讀性強。大的**片段要拆分成小的函式、模組,這樣不管是面試官讀你的**,還是你自己寫**,都會比較清晰些。如果你**寫的不規範,有些面試官會因此聯想到你工作中寫**是不是也不規範呀。
實際上,面試官不只是看你是否能想出演算法、寫出答案,對於一些簡單演算法題目,面試官還會考察你是否能快速寫出**。如果簡單題目都寫的磕磕絆絆,在很多優秀的候選人中,你就很難脫穎而出了。一般來講,乙個演算法題目的思考時間不能超過10分鐘(不包括**實現)。超過10分鐘,你就會緊張,面試官也會等的不耐煩了?。所以,很長時間想不到解題思路的時候,要多個面試官溝通下。
一般來說,我的乙個面試習慣是,拿到一道演算法題目之後,先想最簡單的解決辦法,說給面試官聽,然後再行優化,想更加好的解決方案。這樣做的目的,一方面是緩和自己緊張的情緒,不至於腦袋放空、卡殼,另一方面,一開始就想最優的解法,可能要悶頭想很久,面試官很難知道你的進度,也沒法做指導。
面試官不只是考察你的演算法是否正確、最優,還會考察你的**是否整潔、可讀性是否好、邏輯是否清晰,對於簡單的問題,是否能快速**實現。當然,對於稍微難的問題,面試官也容忍一定的錯誤、bug、不完美。所以,如果某個問題回答的沒有100%完美,也沒必要因此糾結,影響後面的面試表現。
實際上,上面總結的這些都不是特別難掌握,也沒有啥新鮮的內容,你在其他地方可能也都看到過。這些小技巧短期之內都可以速成,面試前一兩周稍微練一下,面試的時候稍微注意一下就可以了。我個人覺得,我寫這篇文章,對你價值最大的就是下面這句話:要想演算法面試應對自如,最重關鍵就是要多刷題,沒有捷徑。
BAT面試經驗分享(機器學習演算法崗)
阿里 對於大資料方面的問題可參考 二面 相隔時間有三周左右,本來以為沒戲了 二面是個大叔,問了專案中的fm和ffm的區別 參考問的主要是專案上的,問了天池大資料比賽的一些問題,因為說了平時會關注最新技術動態,因為就叫我舉個例子,剛好看過微軟識花的那篇文章就好好講了下。最後問了下工作地啥的。二面就40...
給新人的面試經驗分享
下午去參加了個朋友邀請的面試,面試高階前端開發,給我以下幾點 收穫 1 主動 主動做自我介紹,了解面試官想要什麼 需求要點在 2 只需要說自己的故事,讓自己帶動場面氣氛,讓一切隨著自己流動起來。當被問到具體某些技術時,你可以橫向或者縱向切入進去。只需要說明自己為什麼那麼做 技術選型優缺點在 自己考慮...
安全小故事及經驗分享 實用的電工小經驗分享
常言道 靠手藝吃飯的人,豈能沒有點壓箱底的絕招!這話對於我等電工從業者而言,那也是非常適用的。今天,身為電工新人的筆者,便將最近學來的一些比較實用的小技巧,和大家共同分享一下,同時也熱切希望大家也能將自己所掌握的絕招,稍微露那麼一點。香菸是個好東西 都說香菸是有害的,但我們電工工作當中,有時借助一支...