1. 程式人生 > >轉發:春招面經詳細版(轉正經歷過幾天寫)

轉發:春招面經詳細版(轉正經歷過幾天寫)

文章來源:http://link.zhihu.com/?target=https%3A//wangjingxin.top/2018/06/28/recruit/

背景介紹:

作者軟工專業大三學生,山東大學ING工作室後臺組組長,工作黨,參加了18年實習生春招,3月12第一面開始,4.2號最後一面結束,一共面了三家公司。

準備階段:

真正開始準備春招是放了寒假之後,寒假前,我手上還有一個外包,因為甲方時不時的要求導資料,所以放假後甲方不放人,讓我在學校先待一段時間,當然是有償的,但是過了不到一週,我爸給我打來電話,說我爺爺生病住院了,我弟弟也得了感冒要住院,然後我就連夜買火車票回了家,直接奔去了醫院。

醫院的條件很艱苦,沒有網,我跟我弟弟擠一張小病床,我爸在樓下陪護我爺爺,晚上根本睡不好,但是創造條件也要複習,自己開熱點,把劍指offer上的題目刷完了,還刷了幾套往年程式設計題。一直到小年,家人們都出院了,在醫院的這段時間,所做的主要的事情就是刷題,和零碎的知識點複習,大概花了十天。

回家之後條件就好多了,大概可以每天保持14個小時的學習時間,複習資料就是網上的面經,牛客網上刷題(這一段時間刷題並不多),還有工作室學長給提供的資料。

這段時間我還沒有想投簡歷,我想的是等開學後統一投簡歷,結果在一月十八號的時候,阿里C部門主管給我發了個郵件,大意就是無意間逛到了我的github,問我畢業後是否考慮加入阿里,我當時喜出望外,github上有點料還是挺有用的(github上有個大一寫的Java課設,是一個從底層用swing實現的超級瑪麗,當時已經有110多個star了)

但是後來並沒有走C部門,而是走的我校友所在的T部門的內推。

簡歷投遞:

開學後,大概是3.5號,又準備了一週之後,3.12開始投遞簡歷,都是內推。前後分別投了:阿里,百度,美團,騰訊,京東,網易,頭條,華為,鏈家。

筆試:

阿里有一個程式設計測驗,但是不算是筆試不計成績,是一個演算法題,具體的題目忘得差不多了,好像是一個商品組合的最優解問題,我感覺難度還是不小的,想了貪心,dp,都沒有思路,由於限定時間,權衡到最後放棄了思考,寫了個暴力dfs就提交了。

面試乾貨:

3.12首先面的是美團,第一次面試,由於緊張和其他原因,面試表現不是很好。

美團一面

面試官:自我介紹一下

我:(自我介紹都是一樣的套路,所有的)我是XXX,來自XXX大學,大學期間加入了ING工作室學習Java後臺,後來擔任了後臺組組長,做了不少專案,很希望加入XXX公司。

面試官:介紹專案

我:(一個人的命運,不僅靠個人的努力,還得看歷史的程序,我在所有的面試中,著重介紹的專案就是我寒假前的那個外包,因為這個外包對於我來講,的確是我做過的含金量最高的一個專案了,而且這個外包在我們工作室歷年做的外包專案中都是少見的,可遇不可求的高含金量專案,我自認為這個專案給了我很大的優勢,這個專案是一個分類管理系統,對近200萬的結構化資料進行分類篩查,分類依據是多元化的,主要是資料的一個欄位和類別關鍵字的匹配程度,還需要做匹配度的量化排名,而且甲方要求嚴格,隨機抽查樣本,正確率必須達到95%以上,還要支援複雜條件的快速查詢,優化分類過程,所以很考驗演算法能力,和資料庫優化能力)XXX專案是XXX委託的一個外包,實現了XXX。

面試官:那我們聊一聊elasticsearch吧,說說倒排索引是怎麼回事。

我:(上面介紹專案只說了專案的內容,以及實現方法,我自認為面試官會直接問專案亮點,這時候我再把準備好的兩個難點,一個是量化匹配度演算法,一個是資料庫設計和優化一說,就完美了,結果面試官不按套路出牌,沒有問難點和亮點,直接讓聊一聊elasticsearch,還問了個我不會的東西)這個沒有了解過。(出師不利,第一個題就給難住了)

面試官:那你說一說elasticsearch的核心演算法吧。

我:(終於逮住一個會的了)elasticsearch的核心演算法是基於統計的檢索演算法,TF/IDF演算法。TF是本文件中的詞頻,IDF是所有文件中詞頻的倒數,具體是XXX

面試官:elasticsearch的分詞知道吧,你這個專案用的什麼分詞器?

我:用的ik分詞器。

面試官:ik分詞器有兩個粒度知道嗎,你用的哪一個粒度,說說理由

我:有粗細兩種粒度,由於對於匹配精度要求較高,所以選擇了粗粒度

面試官:還有其他選擇ik分詞器的原因嗎

我:我瞭解到ik分詞器可以對詞典進行熱更新,我們這個專案中,每上傳一次關鍵詞,就要更新一次詞庫,所以需要這個熱更新功能,而且這個中文分詞器也是比較出名的一個分詞器。

面試官:說一說hashmap的原理

我:hashmap是基於hash的雜湊,由陣列和一個雙向連結串列組成,陣列長度保證為2的整次冪,方便計算mod值,hash值衝突的掛到連結串列頭部,1.8中做了個紅黑樹優化,優化了XXX情況,在xxx的時候用xxx的方法擴容。

面試官:知道原子類嗎,說說原理

我:使用cas實現原子操作,具體是XXX

面試官:那這個類中表示變數字面量的那個欄位,應該用什麼來修飾?

我:用volatile,volatile是用來XXX,原理是XXX

面試官:說一說樂觀鎖和悲觀鎖吧

我:樂觀鎖是XXX適用於XXX情況,悲觀鎖是XXX,適用於XXX情況

面試官:說一說lru是怎麼實現的吧。

我:(懵逼了,只知道這是採用拋棄最近最少使用的快取策略的一種快取失效演算法,怎麼實現的真沒了解過,然後自己臨時想了個O(logn)的演算法,用二叉堆實現,其實這個實現不是lru,是錯誤的,因為我理解錯了lru。然後面試官可能沒聽出來我理解錯了,只聽了我說這個複雜度是log級,然後就說這個有一個常數級的實現方法,我就不知道了)

面試官:說說mysql中的鎖吧

我:行鎖,表鎖,gap鎖,共享鎖,排它鎖,意向鎖,分別是用來做XXX

面試官:你說說死鎖,以及怎麼避免死鎖

我:死鎖是XXX,產生死鎖有四個必要條件XXXX,可以用保證加鎖順序一致避免死鎖等

面試官:你說說聚簇索引加鎖和二級索引加鎖有什麼區別

我:(懵逼了,不知道啊,實話實說,不知道有什麼區別)

面試官:說一下自己還有哪些專案值得說的

我:大一做的Java課設,可diy地圖的超級瑪麗,完全從底層,基於swing實現,從扣圖到編碼完全自己完成,6k多行程式碼,github上100多star,課設成績年級第一,

至此,美團一面結束,面了大概28分鐘(這麼短),第一次面試感覺發揮的並不是很好,很多東西沒有發揮出來,也有不少的問題沒有答上來,難度感覺中等。

第二天3.13百度打來電話面試。這個表現還行。

百度一面

面試官:自我介紹

我:(還是那個套路)

面試官:說說ArrayList和LinkedList的區別

我:(???沒有問專案,這個比美團還不走尋常路)ArrayList基於陣列,LinkedList基於雙向連結串列,讀寫的優勢,以及LinkedList對於讀取下標的一個優化

面試官:說說hashtable吧

我:hashtable使用獨佔鎖執行緒安全,效率差key不能為null,hashmap原理是XXX(還是那一套)

面試官:那怎麼讓map既效率高,又執行緒安全

我:ConcurrentHashMap,實現原理XXX,1.7和1.8的實現有XXX不同

面試官:我看你寫了一個簡易版的tomcat,是基於nio的嗎?(是)那說說Java的bio和nio

我:bioXXX,nioXXX,nio優勢在於XXX,bio優勢在於XXX,工作原理為XXX,nio使用epoll系統呼叫,epoll和poll,select有XXX不同,epoll基於紅黑樹和連結串列,具體工作原理是XXX

面試官:那你這個tomcat怎麼解決的粘包拆包問題?

我:利用http協議報文格式。在連線層就處理成一個一個獨立的http報文,然後交給解析器處理,具體是XXX

面試官:用過什麼設計模式嗎?

我:策略模式,模板方法模式,單例模式等等

面試官:說一說單例模式怎麼實現

我:飢漢式,懶漢式的雙重鎖校驗,靜態內部類,列舉

面試官:雙重鎖校驗需要用volatile修飾,你說說這個關鍵字是幹啥的

我:這個是XXX

面試官:說說對spring的理解

我:spring是一個bean容器,兩大核心是ioc和aop,原理是XXX,好處是XXX

面試官:說一說Java中的鎖吧

我:自旋鎖,synchronized,讀寫鎖,可重入鎖(公平非公平)基於aqs,aqs原理是XXX,實現原理分別是XXX,底層都是作業系統原語,

面試官:哪些常用的原子變數,原理?

我:(還是cas那一套)

面試官:常用的阻塞佇列,原理

我:阻塞佇列有XXX,原理是當佇列滿,再插入則阻塞執行緒,某執行緒取出元素以後喚醒其他阻塞的執行緒重新競爭鎖,佇列空,取的執行緒阻塞,插入之後將取執行緒喚醒競爭鎖XXX

面試官:說說執行緒池

我:執行緒池作用是XXX,有幾個引數XXX,引數的意義是XXX,工作原理是XXX

面試官:ThreadLocal?

我:用來儲存執行緒私有物件,基於thread物件維護的一個採用線性開型定址法的一個簡單map,key是threadLocal本身,可能會出現記憶體洩露問題,原因是XXX,這個問題使用弱引用解決,具體是XXX

面試官:說說資料庫的設計和優化

我:權衡具體業務的讀寫情況,適當反正規化,索引優化,看執行計劃,慢查詢等,具體XXX(這裡我強行結合專案說了一下,先是小心的問了問面試官,用不用結合專案說一下,面試官答應了,然後就開始講專案)

面試官:redis和elasticsearch都用過?用來幹啥?

我:(對於es,正中下懷,這個專案的另一個難點就是利用es來做的,當即把怎麼利用es來做匹配,怎麼進行優化說了一遍,redis就是說了說用來做快取之類的)

面試官:我看你本科階段做了很多專案啊,你怎麼就想來百度呢?

我:(???這是要轉hr面嗎?然後就企業文化,自我提升等扯了一波)

至此,百度一面結束,大概是47分鐘,總體表現還可以,面試難度屬於簡單模式,沒想到面試官不按套路出牌,不問專案,還好我機智,強行把話題引到了專案上

第二天3.14阿里打來電話約了面試,這次面試是我這今年春招所有面試中最難的一次,面哭了都快

阿里一面:

面試官:自我介紹

我:(套路)

面試官:專案介紹

我:(專案,兩個難點)

面試官:你這個專案,我把資料量擴大100倍,並且放到網際網路上,併發量變得更高了,怎麼解決?

我:(100倍?本來就是200w左右,擴大100倍就是兩億資料,而且還要變成一個網際網路應用,專案本來併發量不高,甲方只要求2000左右,一上來就問這麼難的問題,這下可咋辦)對於大資料量,應該進行資料拆分,這個專案如果拆分的話,最好的辦法是通過不同的查詢條件進行拆分(專案中查詢是根據不同的查詢條件去不同的表裡查詢的,所以這種的有天然的劃分方式)

(還沒等我說完)

面試官:你這樣是假設所有的查詢是平均分不到不同的領域的,萬一有熱點資料怎麼辦,比如有80%的查詢條件命中了一臺機器呢。

我:分佈不均勻可以做一個redis叢集,用來分流。我們這個專案是改動比較少,查詢較多的應用。所以用redis價效比是很高的。

面試官:你這個專案是不會經常改動的,但是最終還是會改動的,如果改動的話怎麼保證資料的一致性?

我:(還是從這個專案本身的需求出發)這個專案資料改動的時候是某個時間段集中大規模改動的,所以改動是有特定的時間段維護的,在維護的時候,我們不允許訪問。

面試官:(完全改了需求)假設你這個就是特別頻繁改動呢?

我:(至此,我這個簡單的專案被面試官擴充套件成了一個高併發,大資料量,改動頻繁的網際網路專案,現如今的問題主要集中在如何保證資料一致性)頻繁改動如果保證一致性的話,可以使用nwr模型。

面試官:用這個方法,可擴充套件性不高,而且還需要在程式碼中感知網路拓撲,因為我們這個是廉價儲存,所以機器可能會宕機,機器數量會經常變化,而且我們現在叢集是異地的,而且不想新增感知網路拓撲的程式碼,有沒有別的方法。

我:這樣的話,根據cap理論,是不可能保證強一致性,除非犧牲可用性。否則只能保證最終一致性。

面試官;但是我們是需要保證強一致性的,因為付款之類的如果有延遲的話,使用者財務不就有損失了,那怎麼辦?

我:(徹底懵逼)犧牲可用性?沒有其他的好方法了

面試官安慰:沒事,你現在的這個方案,對於你現在的這個應用場景是ok的,好,那再聊聊別的。

(剛上來就被一通連環問問懵逼了,不斷的改變業務場景,最後問的實在說不出來話了,果然阿里難度不一般)

面試官:你技能棧中的這些知識是老師教的還是自學的?平時怎麼學習?

我:(介紹了自己的學習歷程,從大一開始,從有學長帶,到學長去工作了開始自學之類的,平時接一些外包做專案提升自己,看書看部落格等等)

面試官:主要是看過哪些書?

我:(說了一些著名的書,thinking in Java,算導,jvm白書等等)

面試官:有沒有參與一些開源的專案?

我:(很尷尬)沒有

面試官:Java的八種基本資料型別

我:(太尷尬了,只說出來了七種,short死活死活想不起來,一生的汙點)

面試官:沒事沒事,Java的多執行緒用的多嗎,Java實現多執行緒的基本方式有幾種?

我:直接new Thread,執行緒池

面試官:還有一種呢?

我:(???還有啥,不知道,後來查資料,面試官可能是想問Callable)

(至此,信心大概被打擊了一半了)

面試官;說說執行緒池的原理

我:(還是那一套,引數,執行過程)

面試官:多執行緒是不是開的越多越好?有什麼注意的地方

我:不是越多越好,因為執行緒的上下文切換需要代價

面試官:怎麼減少上下文的切換?

我:開的執行緒數不要太多。具體策略要分是io密集型應用還是cpu密集型的應用

面試官:怎麼知道當前Java程式的上下文切換開銷,寫一個shell指令碼

我:用jstack,jstack是XXX

面試官:那這個工具有沒有告訴你上下文切換的開銷?

我:(這個jstack還真沒用過)實話實說,這些命令列工具瞭解的不是很多,僅限於理論。

面試官:可以理解,說說Java的鎖,怎麼實現樂觀鎖

我:樂觀鎖基於cas,具體實現XXX

面試官:jvm的堆記憶體模型

我:1.7結構是XXX,1.8結構是XXX,分為XXX,XXX,XXX,每個區域的作用是XXX,可達性分析策略,幾種垃圾回收演算法XXX,新生代老生代的演算法,分配擔保等等

(沒想到這個問題成為另一個噩夢的開始)

面試官:網際網路應用中怎麼對老年代進行優化

我:網際網路應用併發量比較高,所以需要gc停頓的時間短,如果要優化,可以用標記清除演算法,處理速度比較快,停頓比較少,但是會產生碎片,縮小老年代記憶體空間,調整進入老年代的年齡也可以減少gc停頓

面試官:縮小老年代空間有一定的道理,但是怎麼解決碎片問題,有沒有一些引數可以減輕這個問題

我:(這個還真不清楚怎麼解決)實話實說,不是很瞭解。(後來查了資料,面試官的意思應該是CMSFullGCsBeforeCompaction引數,這個引數代表了在經過多少次標記清除之後,進行一次標記整理,對於垃圾回收器的工作方式瞭解的還是不夠,也是當時回答問題的時候思維被限制住了,沒想到多種演算法協同)

面試官:還有其他的方案可以減少gc嗎

我:由於gc停頓是不可避免的,從使用者角度出發,對gc停頓進行均攤,分散到若干次gc中,每次gc時間很小,使用者也應該感受不到。

面試官:平時演算法怎麼樣?

我:看過一些演算法,高中參加過演算法競賽

面試官:約瑟夫問題怎麼解?

我:(這個比較常規的解法是用連結串列或者陣列模擬一下就行,但是這樣肯定特別low,我記得有一個複雜度為線性的遞推演算法,但是想不起來了,最後這個題就只說了一個樸素演算法)

面試官:呵呵沒事

(此時信心被打擊沒了)

面試官:web相關框架的原始碼可看過?

我:spring mvc的原始碼看過一些,其他的沒有。

面試官:說說spring ioc

我:(還是那一套)

面試官:今天我們聊了很長時間,就先到這裡吧,你有啥要問我的

至此,阿里一面結束,一共面了77分鐘,我一度感覺自己應該是涼了,現在只有這個超長的面試時間能安慰我:一般涼了的不會跟你聊這麼久的,所以內心還是有報一絲希望,這次面試難度等級自認為是很高的,而且出現了很多失誤。

過了幾天,到3.16,百度打來電話約二面,這次面試難度和百度一面差不多,算是簡單難度

百度二面:

面試官:自我介紹,專案亮點

我:(還是一樣的配方)

面試官:兩個檔案,儲存著int(32)型別的數值,都是10G,給你8G記憶體,怎麼求兩個檔案的交集?

我:典型的bitmap問題,512M空間解決

面試官:看你用過elasticsearch,說說tf/idf演算法

我:(還是套路)

面試官:一個表有id,point兩個欄位,給定一個使用者id,如何找出來他的排名

我:(一個子查詢解決)

面試官:說說gc演算法,以及jvm記憶體模型

我:(熟悉的配方)

面試官:aop原理

我:(還是套路)

至此,百度二面結束,大概是48分鐘,主要是探討了做的專案,48分鐘中,跟面試官聊專案就用了半小時,因為可聊的東西還是挺多的。面試難度簡單。

過了四天3.20,百度打來電話,約了三面,三面是半hr面半技術面,面試時間大概是40分鐘,主要問了家庭背景,學習情況,學習方法,為什麼想來百度等非技術性的知識,技術性的還是聊了聊專案,然後就給了口頭offer。至此,百度offer已get。

過了一天3.21,阿里打來電話約了二面,二面難度算中等,沒有一面那麼刁鑽。

阿里二面:

面試官:自我介紹

我:(還是套路)

面試官:學過哪些課程

我:專業課有XXX等

面試官:介紹一下專案

我:(還是套路,但是說完之後就打斷了,沒讓我說專案難點,可能跟一面面試官有交流)

面試官:排序演算法會那些,說說快排

我:排序演算法有XX,XX,XX等,快排按照基準值的取法分為取中快排,取首快排,隨機快排。基本原理是XXX

面試官:avl樹瞭解嗎。

我:avl樹是一種二叉平衡樹,要求所有節點的左右子樹的高度差不超過1,二叉樹的操作有建樹,插入節點調整,刪除節點調整,過程分別是XXX

面試官:說說最短路演算法

我:最短路演算法可以分為單源最短路和多源最短路,多源最短路可以用基於dp的Floyd演算法,Floyd演算法的原理是XX,侷限性是XX,也可以用n次單源最短路來實現多源最短路,單源最短路最著名的有基於貪心的迪傑斯特拉,原理是XXX,正確性分析XX,侷限性分析XX,複雜度分析,可以用優先佇列進行優化,原理是XXX,優化後的複雜度分析XXX,此外還有暴力演算法bellman-ford,以及佇列優化的bellman-ford spfa。

面試官:好了,就這些就好了。說一說你對鎖的理解

我:還是那一套,sync,cas,可重入鎖(公平鎖非公平鎖)讀寫鎖,原理,aqs原理等等

面試官:說說Java的泛型,和c++實現上有什麼不同

我:Java的泛型是假泛型,執行時會消除,全部變成Object然後進行強轉,c++的模板是編譯時進行分析,自動生成不同引數型別的程式碼,是真泛型。

面試官:設計模式?

我:單例,策略,模板方法,橋樑,工廠等(沒有細問)

面試官:hashtable?hashmap?Concurrenthashmap?

我:特性,原理,實現,1.7和1.8的優化還是這一套

面試官:談談ioc的理解

我:(熟悉的配方)

面試官:資料庫優化?

我:(因為之前沒有讓講專案難點,所以準備就此問題向這方面靠一靠,結果被面試官打斷說稍微說說就行了,不用結合專案了)

面試官:介紹一下nio和aio

我:還是熟悉的配方,epoll那一套,原理,紅黑樹連結串列

面試官:還有沒有我沒有問到的亮點?

我:大一寫的的可diy地圖的超級瑪麗,我的個人部落格。

至此,阿里二面結束,這個面試官沒有像第一個面試官那樣一直追問下去,問的題目也是很基礎,難度遠小於阿里一面,大概是中等難度

阿里二面五分鐘後,立馬又打來了電話,是三面hr面,聊了大概20分鐘,聊了聊家庭,生活,學習,專案,大學的經歷,實習時間(感覺有些穩了)

過了幾天,3.27晚上,美團打來電話約了二面,這次面試難度還是相對高一些的。

面試官:自我介紹,專案介紹

我:(套路)

面試官:怎麼使用es來對面試者進行分類。

我:這是一個聚類問題,首先對面試者進行資訊採集,然後進行資料清洗,標準化處理等,然後可以使用kmeans等無監督學習演算法進行聚類,es用來計算兩個面試者的相似性,對於面試者的技術棧,自我評價等非結構化資料,可以看做文字,用es進行匹配,來計算二者的距離,最後計算綜合相似讀(這個我也說不準這樣可不可以,但是這好歹是個思路)

面試官:現在有若干借貸者,若干投資者,求一種最優的匹配策略。

我:(這個問題需要先考慮什麼算是最優,最後和麵試官探討的結果是,儘量較少使用投資者,儘量動用資產少的投資者的錢,這樣的話,這個問題可以看作是一個布林揹包問題的變形,對每個投資者,進行一次揹包,看看哪一個可以容納得下最多的借貸者,然後容納同樣多的就使用資產少的,然後將這個投資者和他所容納的借貸者去掉,對剩下的借貸者和投資者再次進行dp,直到所有的借貸者都被包含。這個是一個貪心的思想,並沒有證明是否真的能取到最優解,但是絕對是可以取得到近似最優解)

面試官:說一說spring mvc處理請求的過程

我:(就是怎麼被這幾個元件處理的)

面試官:說說過濾器和攔截器

我:(很簡單,基礎知識)

至此,美團二面結束,大概51分鐘,難度中等偏上,這次是主管面的,問的演算法較多。

當天白天,3.27,阿里打來電話約四面,這次是視訊面,提前說了需要手寫程式碼。加了面試官的微訊號。

3.28下午阿里四面,這次面試難度中等偏上。

面試官;自我介紹,專案

我:還是套路

面試官:redis談談

我:redis的應用場景,在專案中的應用等談了談。

面試官:說說分詞演算法

我:(這個還真不知道,最後上網查了查,什麼隱馬爾科夫模型啥的,後來上課學了一些皮毛)

面試官:說說tf/idf演算法

我:(這個問題第三次遇到了,輕車熟路)

面試官:說一說jvm的命令列工具,

我:jmap,jstack等,功能是XXX

面試官:倒排索引說一下

我:(美團一面問到了,不會,過後看了看)倒排索引是搜尋引擎的核心資料結構,原理是XXXX

面試官;好,手寫演算法吧

(終於到這裡了)

N個球隊,每個球隊有一個球隊的水平,水平是個整數,設計一個函式,每次呼叫函式,隨機取出一個球隊,要求,取出的球隊的分佈和球隊水平成正比。

我:(拿起A4紙開始寫。這個題目不算難,主要是考慮怎麼利用現有的產生均勻分佈隨機數的random函式,對映成變成和球隊水平相關的隨機數,這個可以用幾何概型的思路,把球隊的水平,抽象為線段,線段的長度就是球隊水平,水平越高,線段越長,所有的球隊的水平總和,即為整個線段的長度,每次從線段上隨機取一個點,判斷這個點屬於哪一段,那麼這次取出的就是這個球隊,這樣就達到了題目說的要求,思路有了,關鍵是怎麼設計資料結構。這裡有兩種思路,一種是取球隊是常數級複雜度,但是比較耗費空間,具體是,開闢一個大小為球隊水平總和的int陣列,然後對每一個球隊,將一段這個球隊水平長度的陣列的值設定為球隊id,這樣每次隨機生成一個0到球隊水平和的隨機數,返回以這個隨機數為下標的球隊的id即可,這樣雖然取球隊的複雜度低,但是預處理的時間可能會很高,而且佔用空間也很大,因為這個寫起來簡單,為了快速表達思路,我在紙上寫的就是這個方法,交給面試官看之後,面試官說你這個空間複雜度太大了,有沒有別的方法,我隨即說了第二個方法,犧牲了一些取球的效率但是換來了極大的空間和預處理時間的節省,第二個思路就是隻存端點,每個球隊擁有一個區間,區間的長度即為球隊水平,區間不重合,先對區間從小到大排序,然後每次生成一個隨機數,將這個隨機數也看成一個長度為0的區間,然後用二分法查詢到對應的球隊。這樣預處理是O(nlogn)。每次取球隊是O(logn),空間複雜度是O(n)這個方法價效比還是比較高的,跟面試官說了這個思路後,面試官還是比較滿意的)

至此阿里四面結束,大概是50分鐘,這一面難度中等偏上,也有一些沒有答上來的題目,但是最後的演算法題回答的還是不錯的。

過了幾天3.31,美團打來電話,約了三面,這一面本來應該是技術面,但是這個面試官轉了管理了,所以就成了hr面。也是問了家庭,發展規劃,學習,大學經歷等,而且這個面試官還問了有沒有女朋友,然後又問了女朋友怎麼看待去上海工作,還問了打不打遊戲。大概面了27分鐘。

過了兩天4.2號,阿里打來電話,五面hr面,跟面試官聊了聊家庭學習生活職業規劃,介紹了一下公司,問了問實習時間。大概22分鐘

第二天4.3號,美團打來電話,四面hr面,談了談薪資,發了口頭offer,問了問規劃等。八分鐘。

過了兩天,4.5號晚上阿里發來了簡訊,說已經發了意向書,然後我立馬下床開啟電腦點了接受。然後撤掉了還沒有面試的其他所有簡歷。

後來我才知道今年阿里對集團的實習生要求比之前提高了一個檔次,只要A和以上的,真是不知者無畏,如果我早就知道這個訊息,為了穩妥,我可能就不走T部門的內推了。

至此,我的春招實習完全結束,最後拿到了三份offer。

 

自己對結果還算比較滿意,但是沒有參加騰訊的面試還是比較遺憾的,雖然後來也邀請我面試了,但是還是拒絕了,因為已經有了心儀公司的offer,驚心動魄的春招已結束,就不去浪費其他公司的面試資源了。對於春招,雖然一開始準備的時候,家裡遇到了突發狀況,有一些小插曲,但是總體來說還是比較順利的,但是就面試表現來看,我感覺自己還是有提升空間的。

面試總結:

1、從面試題目來看,大廠校招還是看重基礎的,三個公司一共七次技術面,其中有六次涉及到了資料結構和演算法。所以,一定要重視學科基礎,基礎不牢,地動山搖。

2、面試準備一定要儘早,刷題更是要儘早,不妨現在就開始,leetcode,codeforces,多刷題總沒壞處。

3、一定要主動向面試官表現自己,有時候面試官可能不會去深入問,但是你自己去深入的介紹,面試官一般不會打斷你,但是你雖然懂的很深,但是隻是簡單的說了說,面試官又沒繼續問下去,這樣就很難受了。

4、對於不會的東西,一定別胡謅,但是也不能不說,不會也要自己去擴充套件,延伸,說出自己的心路歷程。比如面試官問A,我不會,但是我知道跟A很相近的B,我說一下B問題的思路,總比什麼都不說強。

5、Github上要用起來,經常往上放一些東西是很有用的,參考C部門主管內推的例子。

6、基本上每一面面試官都會問你有沒有什麼要問他的,一句話,一定要表現出來你熱愛學習,熱愛技術,可以問一些比如”對我以後的發展提一些建議“或者”公司培養新人的模式“此類問題。

7、面試過程中即使感覺自己前面表現不是很好,也別放棄,一定要全程保持冷靜,保持積極,參考阿里一面。

8、平時如果接外包,一定要接有質量的,一些無新意無挑戰無難度的外包,除了能賺些錢就是浪費時間了,大學生的時間很寶貴,不要把時間浪費在賺小錢上。

9、學習一定要深入,不能淺嘗輒止,會100種語言的hello world是沒有用的,尤其是在校生,對技術鑽研的深度比廣度更重要(當然前提是廣度不能過於狹窄,需要自己權衡),灌木叢是永遠無法成材的。

10、面試也看緣分,即使沒有通過面試,也別放棄,吸取經驗,再接再厲。

以上是我的春招面試經歷,希望我的經歷能夠給大家多少帶來一些啟發,在此我要感謝碼農翻身的劉欣老師,我從大二就開始關注劉老師的公眾號,一篇一篇妙趣橫生的文章將晦澀難懂的技術講解的如此有滋有味,讓我非常受啟發,極大的擴充了我的知識儲備,還要感謝我的女朋友,一直陪伴著我,鼓勵著我,讓我有動力去努力奮鬥。