專欄 | 九章算法python
網址 | www.jiuzhang.comc++
做者:CMN 九章學員,上過《Python算法入門基礎班》《算法面試高頻班》git
簽約offer: Bloomberg News程序員
拿到offer: Bloomberg News面試
求職經歷算法
個人背景是美碩,商學院 IT, 而後是在碩士在讀轉了 IT 專業。由於課程都很偏商,因此只有幾門簡單的編程或數據庫的課程,徹底沒有涉及算法的課程。我畢業後加入了最後一個學期時實習的公司,職位是 Database engineer。sql
作了大概一年後,機緣巧合在一個雪友的介紹下開始知道有算法這麼個東西,想要轉行找好的碼農工,須要過這一關。因而下決心開始準備。數據庫
我是今年2月開始投簡歷的,花了500大元找人改了簡歷和linkedIn page(主要是我本身寫簡歷水平太差再加上實在沒時間改)。編程
1.收到了2個小公司的面試邀請api
第一家公司基本沒有算法題,見了全部人,而後最後讓回家寫個restful challenge, 這個我沒寫好,被拒了。第二家,面了兩道題,valid parenthesis 還有 number of island很簡單,相信你們均可以秒掉。最後的onsite是系統設計, 設計一個調查問卷。ood, 設計一個電梯。感受小公司仍是很看重你的經驗的,若是你會他們要的,就留,不會就滾。
2.Facebook 的 data engineer 電面
這個是 hr 在 linkedin 上聯繫我獲得的,雖然感受和本身想要轉行的前提有點不符(我想作 software engineer)可是畢竟是 facebook,仍是要試一下的。感受他們要考的東西都是我每天作的,確定駕輕就熟,沒想到電面就掛了,電面考的是30min sql, 30mins 編程(lintcode naïve級別)。若是有同窗想申請這個職位,在作 coding 時千萬不要 overthinking, 我在面試的時候就試圖 implement split()這個 function, 面試官直接說不知道你在幹什麼,能不能從上面的函數列表裏直接挑一個作這步,而後看到 split function 赫然在目。而後由於相似的狀況浪費了不少時間,再加上無比的緊張最終掛掉。對我打擊超大,以爲本身老本行都搞不定,更別提轉行了。但仍是毅然選擇了堅持找,因此你們也同樣不要灰心。這個職位考的是對數據集,表及關係的理解,把 buisness case apply to table and relationship這一類。工做中也是主要作 sql, 和設計一些 data pipeline 一類的工做。
3.Amazon的 SDE 紐約組
海投亞麻,而後竟然在3個月後收到hr迴音,作 OA. 把 OA 面經大全翻了個遍。而後都作了,可是仍是因爲過分緊張,第一題徹底看錯了題,find all substring with length k and have k distinct character. 其實就是找全部k長度的沒字符重複的詞嘛,沒難度,恰恰沒看到那個 length k, 這樣浪費了30分鐘,所有重寫,致使第二題來不及。你們在作時必定要仔細看題。第二題,是說給一個 tag list = [「I」, 「love」,」jiuzhang」], 而後一個字符串數組 [「I」, 「you」,」her」,」love」, 「I」, 「JiuZhang」], 讓返回一個最小的含有 tag list 全部詞的區間順序無所謂。這題就是[3,5], 倆指針就行了,可是實在時間來不及。OA時還有個地方我以爲要注意就是若是時間不夠,必定要讓程序能夠compile, 否則都不會送到 review。
課程幫助
1.上課篇
開始的時候一頭霧水,整個過程就像一個深度優先搜索,先從 MIT 的公開算法導論課開始,發現第一節課後開始已經暈逼,而後各類網上資源,都無功而返。大概是從將近兩年前據說了九章的課程,而後才終於進入了正軌。
上了一遍算法和強化以後,忽然工做開始變忙,因而暫停了半年刷題而且把以前原本就半桶水的技能所有忘光。因此毅然決定再上一遍,而後忽然感受第二遍時慢慢找到了些感受。我一點我的的建議特別是對在職的同窗,必定要把上課和作題連起來,這樣的話由於不用不停的回憶以前講的內容,因此實際上是省時間的,若是斷了就再上一遍,由於即便是第二遍,也會有不少新的收穫,我我的在第二遍課時就經歷了幾個頓悟的過程。還有一個經驗就是高頻題班在開始面試前的效果很好,尤爲是對於像我同樣數學和計算機基礎比較薄弱的同窗,能夠保證若是遇到這類偏題(好比稀疏矩陣乘法,大數乘加,模擬),不會無從下手。若是連基本的語言都還不會的話,能夠考慮上《九章算法基礎班(python)》,先學好python,再開始刷題。
2.刷題篇
在最開始的時候,這是最打擊的部分。算法題的兩大法寶,拿到題選什麼算法和如何實現這個算法,這兩個都不行。但我我的感受,後者比較容易,因此能夠先從實現算法開始練起(lintcode的分類階梯訓練),而後當和一些標準算法數據結構都不陌生後,再去見新題,看哪一個算法能夠解決,後面這一步也是我花時間最久的一步,也是我以爲我從九章課上收穫最大的,由於訓練的是思惟模式,好比看到topk, 就能夠聯想到heap,看到找所有解就要想到如何搜索,看到簡單圖或棋盤,就要想到bfs。
還有一個我以爲幫助我很大的是分類和記錄本身的作題記錄,好比gitbook,或一些博客網站均可以。常常一個題作了倆禮拜之後好像歷來沒見過,或者說記得第一和第三步,可是忘了第二步,這時候能夠回去翻一下本身從前的思路,能夠發現是再哪個思惟步驟斷層了,重點記這個。我的經驗是寫的越細越好,否則事後根本看不明白。
我天天能夠用來刷題的時間不多,只有回家後大概從8點開始刷,一天的工做後狀態也很是差,因此我就把節奏放慢,少刷幾道而後反覆根據思路刷,我喜歡一邊叨叨一邊寫,這樣能夠督促本身確實明白瞭解題的每一步,並且也就當練練面試時的場景。這樣堅持了大概7到8個月,雖然只刷了大概350左右,但基本能夠保證60% bug free而且能夠解釋思路。這一步我想根據你們可支配時間來決定,還有就是連續堅持,不要斷斷續續。
3.準備建議
1.關於Bloomberg
兩連敗了之後,這是我剩的最後兩個面試了。由於我同時申請了兩個職位,兩個都發了面試邀請因此就一塊兒進行了。挺hr說彭博愈來愈不要求 c++了,因此像我這樣從沒碰過 c++的同窗均可以去試試。
2.第一個電面
上來先問簡歷,而後基本數據結構實現,例如,如何減小 hash map 中的hash collision, b tree 是否是 binary tree, linked list/array/ hashmap/hashtable 啥時候該用啥這類的問題。這個必定不能不會,尤爲面彭博,若是不會說明你還沒準備好,能夠再拖一拖。算法題是在二維矩陣中從左上向右下的路徑總數,動歸就行了,也能夠搜索。要講清思路再開始作題。
3.第二個電面
沒有簡歷直接作題,Process log, [[1,5],[1,6],[5,7],[9-11]] 表明各個 process 的起點和終點,返回全部沒有 job running 的區間。和 number of airplane in the sky 略微不一樣大致思路是同樣的。在返回上。Follow up 是讓返回最少 process running 的區間,先找到最小的數,而後返回區間是那個數就行了。最後要merge 重疊,也是 Lintcode 原題。第二題有點難度,給一個 list of new hires 和一個 list of hiring entity, 而後每個人對每個用人單位都有一個喜愛度排序,每個用人單位也對每個new hires 有一個喜愛度排序,問如何找出一個穩定的 match, 能夠參考這個文章:
www.cs.princeton.edu/courses/arc…
順利拿到兩個onsite安排在了同一天。
1.1. 兩個 engineer, two sum 變種,找到兩個最早(index最小)的相加起來等於 k 的一對數,follow up what if 是 m 個相加起來等於 K 的數?
1.2. 兩個超級 senior 的 engineer, 第一個問題出奇的簡單,問若是從一個 matrix 的一點出發,若是計算全部 neighbor 的和,而後 follow up 是若是加一個 Input 是找距離該點爲k的行和列的和而後後面是這樣,給一個 stock data stream, input 是 stock 名字和交易量, 設計一個系統實時返回 top k 交易量,各類狀況分析,實現原理,複雜度分析。你們這裏劃重點啊,令狐老師海量數據處理原汁原味的原題,在線詞頻統計,這個必定要看。
1.3. 就在我以爲一切已經結束的時候,又款款的走進兩位工程師,而後開始 word stream, 不須要實時,返回 alphbetical order 和詞頻統計。 用到 hashmap,而後比較各類 sort, 若是 Input 是 linked list 咋作? hashmap 怎麼實現的,各類計算機基礎知識,一道看似簡單的題大約聊了30分鐘,寫碼大概只用了5分鐘。剛要鬆一口氣, 設計電梯類,要求處理 request 和電梯停動的算法。
1.4. 老闆出現而後帶我去吃了個 Lunch (很是好吃的希臘餐館,推薦你們,在大廈對面)順便了解我找工做的動機,想要發展的方向。上午終於結束
2.1 下午依舊作題,stream words classification, 給一個 api 告訴你兩個 Object 是不是同一類的,若是處理去重和不去重兩種狀況。而後後面一題,給 time slots of meeting room booking [[1130,1200], [1130, 1230], [1230,1400]]問最少須要多少個meeting room, lintcode 原題,number of airplain in the sky. 排序掃描線。
****2.2 繼續,買賣股票一次交易最大收益,而後 follow up unlimited number of trade 最大收益,有點懵,最後討論想法思路,給了不少提示。而後系統設計,不說具體,但基本意思是,如何處理數據傳輸前獲取服務器狀態用時過長的問題。
終於在以後一天同時拿到了兩個組的Offer,歷時兩年的學習準備終於能夠告一段落了,比預期的收入大概多了40%,並且新的base是我目前薪水加獎金的2.5倍,收到通知的一刻比當年高考錄取還要爽。終於能夠鬆一口氣了。最後有幾個雞湯想跟你們分享一下。
1. 參加 lintcode 每週的算法比賽,享受從3000名飛躍到500名的快樂,這個給了我很大的動力。並且也能見識不一樣的題。
2. 若是時間有限,就要規劃出時間只留給學算法,個人特定時間是工做日天天8點之後直到睡覺。週末上下課,想刷就刷,不想刷就玩一下。
3. 多上qq羣交流,安利身邊的人也來學算法,而後藉機站在過來人的角度給他或她講題,增長本身的成就感也鞏固學的知識最重要的是有人一同做戰。
4. 用本身的工做或學校project增長本身的軟技巧,與人溝通的能力,而且把本身的想法解釋給別人聽的能力。也能夠本身對着白板bb,有用就是會有點無聊。
5. 儘可能利用身邊全部能用的資源,朋友內推,九章官網長期內推貼等,而且能多作幾回Mock就作幾回。
6. 最後就是想說,若是我這樣的算法小白加腦子不靈光還沒時間的人均可以,全部人只要有足夠的恆心和正確的方法,都必定能夠拿到本身想要的offer。