1. 程式人生 > >參加阿里巴巴校招面試經歷

參加阿里巴巴校招面試經歷

問題5.讓實現兩個方法,一個插入一個查詢,資料是一個個的字串。資料結構自選,我一看機會來了,就從線性表(陣列和連結串列)開始說起,然後談樹,從最簡單的查詢樹又講到紅黑樹,然後又開始說雜湊,大談雜湊和紅黑樹各自的優缺點。然後面試官說:你不用和我說這麼多,我就讓你實現兩個方法。我說那我實現一下雜湊吧,然後就開始寫程式碼,程式碼大概是這個樣子的:

int hash(char * str)//把字串對映為一個數字
{
    int ans = 0;
    while(*str != ''){
         ans = (ans * 31 + *str) % SIZE;//雜湊桶的數目為SIZE
    }
    return ans;
}

bool insert(char* str)
{
    int idx = hash(str);//table表示一個已經初始化好的桶
    while(table[idx] && idx < SIZE){//如果當前位置已經存,向高位去探測
         ++idx;
    }
    if(idx == SIZE)//表示越界,插入失敗
         return false;
    else {
         table[idx]=str;
         return ture;
    }
}

其實是個非常非常簡單的雜湊,然後面試官問,這樣如果資料數量超過了桶的大小,那一定會出錯的,有啥不出錯的辦法呢,我說這個table裡面一個元素只能存一個值,但是如果我存的是連結串列的頭結點,就可以存多個值了。時間好像到了,然後面試官也沒有繼續讓我寫,就說就這些問題了,然後就讓我問他問題,我請教了一下在阿里大概生活什麼狀態,然後就愉快的結束了此次面試。

這次面試後,由於一些陰差陽錯,和通知我這次面試過了的人總是沒能聯絡上,後來終於聯絡上了,然後被告知等訊息,後來得到了去阿里面試的訊息。並且被通知的是終面,高高興興去了。

進一小屋,見到面試官,面試官看了眼簡歷“你沒有筆試卷子?”“你之前也沒面試記錄?”,然後在我簡歷上大筆一揮寫下“建議先XXXX(沒看到)”,然後就說,你出去等著吧。遂從終面,降級為從頭開始面。

真人面試第一場

我還沒有搞清楚狀況,就被另一個面試官帶到一個很多對面試官和應聘者的小屋。面試官開始看簡歷,然後問問題。

問題1.兩個字串,把第二個串中出現的字母從第一個串中去掉。例如,a: Hello world b:el 最終為:Ho word。要求空間複雜度為O(1)。

最初理解錯題意了,我以為是完全匹配才去掉,然後寫了半天,寫完了給面試官看的時候,被告知搞錯了,遂重寫,想法就是把b串對映到一個table裡面,然後第一個串挨個字元判斷有沒有,有的話就去掉。實現上很多需要注意的地方,最終的要求是隻掃一遍a字串就把結果給出來,寫著寫著也寫出來了。

問題2.談專案,依舊是問,程序排程和通訊如何做的,記憶體管理如何做的,支援哪些介面,如何實現的。然後我就說自己只是實現了最簡單的功能巴拉巴拉,面試官問,那你的記憶體管理如何優化呢?我又巴拉巴拉說了一些。然後又被問到SQLite某個介面內部是如何呼叫,如何實現的(因為簡歷上有寫做過分析SQLite的專案)。但是當時做的並不細緻,這個問題沒有答上。

問題3.問a[5][5] 和 **p=a  a[2][3]和p[2][3]指向的是同一個位置嗎?我答不是,然後問為什麼,我是瞎猜的當然不知道為什麼了,然後面試官又很nice的引導我,讓我儘量自己去給出答案。面試官真心贊!

問題4.問了一個C++的多型是如何實現的,在我答出虛表之後,又問基類的虛表是什麼樣的,派生類虛表是什麼樣的。對於C++瞭解的真心不多,於是瞎猜也不知道猜的對不對,然後面試官說既然問到這裡又問我一道關於繼承的問題,不過我不會。面試官很nice的說“沒事,每個人的知識結構都不同,不可能全都覆蓋嘛”。

面試結束時,我問的記憶體洩漏都可能有哪些情況,然後被告知情況太多了,要靠經驗來了,這也是為什麼高手之所以值錢的地方。於是就繼續去等下一次面試了。

真人面試第二場

感覺這次也是一面,因為還是在一個很多面試官和應聘者的屋子裡,第二位面試官不知道為什麼,很多時候我說完了他都不說話,在那想。開場的時候他很熱情的自我介紹了一下,然後就開始面試。

問題1.“隨便寫一段程式碼吧,短點的”,於是我就把上面寫過的hash函式寫了,問我為啥寫這個,我說因為之前電面的時候寫過,聯想就寫了。現在後悔啊,我寫strcpy多好,還漂亮,還短。

問題2.問我++a和a++有啥區別,我說一個建立了副本,++a更快速一些,他問你測過效果嗎?我又說,其實在這裡面時間是一樣的,因為編譯器給做優化了。他又說,那這個技巧就沒用了唄,我說不是,當a是一個結構很大的類的時候,建立一個副本開銷是很大的,還是很有用處的。

問題3.從雜湊聊啊聊聊到了紅黑樹,讓講講紅黑樹,然後又給他說了一下紅黑樹。

問題4.看我簡歷上寫了在某專案中實現8種排序演算法,於是讓我介紹一下排序演算法各自的優缺點。於是我從快排講起,然後講快排的優化,講插入排,講堆排,最後又說STL中sort的實現方式(快排+堆排),又提了一嘴計數排。

問題5.看我之前沒有做過筆試題,讓我做筆試題最後幾道大題中的兩道,第一道:在一個數組中找到min和max,要求比較次數越小越好,說了一個比較次數是1.5n次的。第二道:求三個升序陣列a[l],b[m],c[n]中,每個陣列出一個數,要求max(|a[i]-b[j]|,|a[i]-c[k]|,|b[j]-c[k]|)最小。我想了一下給出了一個l*(log(m)+log(n))的,用二分查詢在後兩個陣列找離的最近的,然後去比較。被問還有什麼別的想法,後來又提示歸併排序,最終給出了用歸併的想法,O(l+m+n),個人感覺,這個想法有的時候真的未必比我第一次給出的二分的效率高,比如當m,n特大,l特小的情況下。

問題6.問static關鍵字你都一般怎麼用,我說修飾函式和變數。然後又問const關鍵字,判斷是內容不變還是指標不變,這個之前看C++primer裡面有講。然後又問知不知道volatile,我說見過,查過,但是沒用過。

問題7.又是聊專案,還問為什麼投的是杭州的。

基本面到這裡就結束了,讓我繼續等著。

這時已經12點多了,阿里管午飯,和兩個小夥伴一起吃的。

真人面試第三場

第三場的場地明顯就高階大氣上檔次了很多,雖然也有幾對面試官和應聘者。以讓我自我介紹開場。

自我介紹之後,他明顯對我說的東西沒啥興趣(確實是有點假大空),然後聊實習經歷(唯一的一個聊實習經歷的面試官)由於實習乾的工作確實都很弱,也沒啥好說的,顯得自己很低端。然後又開始聊專案,依舊是之前問過的問題,都差不多。然後問我對哪些技術感興趣,我說網路程式設計,還有NoSQL,比如redis,mongoDB這些。果斷被問到這些內容,我只是感興趣,打算下一步開始學習,當然不會啊,只能說不會了。聊的差不多了,問了兩道題,可能是三面已經是下午了,我開始犯困,腦子開始不靈了。

問題1.程序執行緒區別。答是否擁有資源,一個程序可多個執行緒,開程序消耗資源比開執行緒多等常規答案。問,還有嗎?看我答不出來了,又問開程序和執行緒分別都需要什麼資源,答程序需要開獨立的記憶體空間,執行緒不知。

問題2.給一個旋轉有序的陣列,所謂旋轉有序,比如1,2,3,4,5算。4,5,6,1,2,3也算。在這個陣列中查詢元素p,返回bool是否找到。讓寫程式碼,介面給定義好。這個問題也算不上難,用二分的想法很容易就寫出來了,然後他看了半天我的程式碼,應該是沒啥問題,然後開始下一道。

問題3.給定一個矩陣,裡面是‘#’或‘.’,一個表示可以走,一個表示不可走,給定初始的位置bx,by。給定結束的位置ex,ey。還有個梯子,梯子長度為N,用梯子可上走可下走。判斷是否可走到。一看,簡單深搜廣搜都能做的簡單題,遂開始吹牛,說這題簡單,用深搜廣搜都行神馬的。被問深搜廣搜區別,秒答之,廣搜能找到最短路徑,但是費點空間。遂題目升級為求出最短路徑,用廣搜。然後就是我悲劇的開始。這個題真心簡單,只不過一年多沒有寫廣搜的程式碼了,也可能是累了,當然最可能的就是自己太弱了。寫的奇慢,幹寫不出東西,我自己都不太理解,想法很清楚,為啥寫的這麼慢。而且還有各種錯誤,各種被找出來。最終死在了一個天大的BUG上,忘記標記走過的路了。肯定會爆記憶體啊。這要是機器寫,一執行就看出來了,可是手寫就都要自己想清楚,要不然就跪了。

在指出這個BUG之後,面試官說,那我這裡沒什麼問題問你了,你有什麼問題嗎?我又把記憶體洩漏原因這個問題問了一遍,答案和上一次問差不多。從面試官的態度,我知道自己跪了。他然後嚴峻的說“那你回去吧,帶好東西”。我出去逛了一圈,想要留一下他的名片,於是又走回去要了一下名片。他說沒帶名片而且公司好像也…我就懂了,然後他堅定的伸出了胳膊指向門口,看著他皺著的眉頭,我知道,必跪無疑了。又深深的後悔自己這個SB行徑。

面試,真的靠緣分,要看面試官和自己是不是有眼緣,要看面試官的知識結構和自己是否交叉的地方很多。不管怎麼說,一次獨特的人生體驗吧,感謝阿里花這麼大成本(前後4次面試)來面我,雖然最後悲劇的概率極高,不過從這幾次面試中還是能看到自己很多問題的,也學到了不少知識。當然更是認清了自己弱菜本質。

還有一個同去的小夥伴,明確的被告知回去等offer~在這裡恭喜他啦!

對自己說:加油,奮力前行!