1. 程式人生 > 其它 >22/4/11 記錄極為令人難忘的阿里一面

22/4/11 記錄極為令人難忘的阿里一面

22/4/11 阿里一面 記錄和覆盤

電話面試,晚上7點開始,全程2h22m,是我經歷過的最長的面試。面試我的似乎是一位leader級別的人物,給我感覺很有親和力,很有耐心,教我很多東西,人真的很好。
前情提要:阿里7號的筆試有3道題,前兩道都是送分,第三道我感覺是我比較熟悉的一個滑動視窗(事後發現並不是),一頓寫,交上去0%正確,怎麼都不對。遂心態略崩,第二題也沒寫完,估計是筆試很差了,但是沒有直接刷我簡歷,而是給了我一個一面的機會。(再次感謝)
開場沒有讓我自我介紹(我猜是他看過我的簡歷了知道我菜的一批沒啥可以說的--),而是聊了一下筆試題。面試官問我筆試什麼情況,我說對題目理解可能有問題,面試官讓我現在重做一下試試,我說好(然而我的思路依舊是錯的)。
題目:小紅有一個僅包含小寫字母的字串s,長度為n(n<200000),現在想從其中找到一個連續的子串,把這個子串刪除後,保證剩下字串中字母的種類至少為k(1<=k<=26)種。求所有可能的方案數量。定義若選擇刪除子串的起點和終點座標不一樣即為不同的兩種方案。
重做時我的狀態非常差,快30分鐘都沒有寫完。面試官給我說,要不先給他講講思路?我給他講了一遍我的思路:先遍歷字串,記錄字串中每種字元的種類和數量並存放到一個map裡。接著維護一個視窗,視窗也維護一個map並和原串的map比較,若發現兩張map中某個key的value相等,說明視窗增長使得字串的某個字母種類減少了,當減少為k時記錄視窗長度並計算其中的方案數量。
我寫的很慢,講述的也不清晰,面試官可能是為了安慰或者鼓勵我,給我說,面試考察的並不主要是程式設計敲程式碼的能力,更是發現問題並解決問題的能力。
接下來面試官問我程式優化可以從哪些方面入手?我聊了時間複雜度、用空間換時間等等。我感覺我的回答並不使面試官滿意。
他讓我先寫一個隨機生成字串的小程式,再打個表記錄一下程式執行的時間。我照做了,結果長度1000時我的程式跑了40多秒(後來我算了一下,時間複雜度應該是O(n^4*logn))。這時,最讓我震驚的時候來了:面試官把他寫的Java程式碼貼了出來!好傢伙,面試官居然和我一起寫程式碼!我感到深深的震驚,這場面試的性質似乎已經變了,不像是大公司招人在考察候選者能力,而是一位師傅循循善誘教育徒弟解決問題的方法。面試官的方法非常之巧妙,令我歎為觀止:用一個32bit整數即可表示26個字母的出現情況(相當於一個map<char, bool>)。而記錄時只需要從原串的左端和右端開始考慮,不用管字串中間的情況(只需知道起點和終點即可計運算元方案個數)。面試官還告訴我,他的程式跑200000長度的字串只需1ms,但是還可以更加優化。
我這時明白了,要優化一個程式的時間複雜度,或許應該從底層、架構、設計方面入手,如果最開始的設計既是非常低效的,那麼在此基礎上的所謂優化其實沒有意義。
程式設計告一段落,接下來是一些比較常規的面試問題。
專案的背景?答自己為了深刻學習網路並加以實踐而做的。
看到你用了poll,說說為什麼?和epoll有什麼區別?聽說過哪些實際的高併發框架?(答nginx)有使用過或者看過原始碼嗎?(無)面試官告訴我,面對這種高階的技術也可以嘗試把他用在自己的專案裡,或者閱讀他的原始碼。這讓我感受到,我的知識儲備是匱乏的,尤其是在深度上,沒有靜下心來去鑽研。
http協議瞭解多少?講講輸入一個網址並回車後發生了哪些事?
這裡聊的比較詳細,每一層的協議都有涉及,很多零碎的小問題現在難以回憶了,但有一個問題令我影響深刻:兩個子網如果不能ping通,應該如何排除故障?除了ping命令還有哪些指令可以用來除錯?感覺這裡是有意考察我的綜合能力,但我答得比較差。
未來幾年有自己的計劃嗎?為什麼不考研?

面試結束,我的心情仍然很激動。我知道我大概率是進不去阿里了,但是 ,我遇到了一位極為謙和、有耐心的前輩。教會了我大量的道理,學習的方法和態度,願意花費兩個半小時來指導素不相識的後輩,真的是大佬風範!

技術應該靜下心來,戒驕戒躁,做一個領域就去做深,做細緻,做到最好。