時間:2017年10月16日11:30面試。前端
地點:重慶萬達艾美酒店。面試
信息:女,本科應屆生,面試後臺開發崗位。算法
在深圳的面試已經所有結束了,偶然間聽朋友說重慶、長沙等場地的面試還在進行中,只要修改面試地點,仍然有機會拿到面試機會。因此我抱着試一試的心態,在騰訊校招官網上修改面試地點爲重慶。10月13日中午收到了騰訊的面試通知,面試時間是10月16日11:30,面試地點在重慶萬達艾美酒店。數組
收到短信通知的那一刻就已經有點緊張了,一開始我也很猶豫到底要不要跑回重慶去面試,電話裏我爸說我既然那麼喜歡騰訊,就應該抓住每一次機會去嘗試,不看結果,至少咱們經歷過嘛。因此14日一大早就買上了15早上飛往重慶的機票。我也不斷提醒本身,緊張只會影響發揮,就當本身是回重慶改善飲食、度度假的。抱着這種心態,一直到走進萬達艾美酒店以前我都再沒有任何的緊張感。當酒店正門在視野中出現的那一刻仍是忍不住緊張,因此我努力使本身保持微笑,一有機會就跟身邊的人閒聊,漸漸熟悉周圍環境以後也就忘記緊張這個名詞了。服務器
電梯裏遇到兩個小哥哥,兩個都是面試產品經理的,其中一個也是跟我同樣來自深圳,酒店服務員讓咱們來到4樓,一出電梯就看到一組二維放置的椅子,裏面稀稀落落的坐了很多來面試的,他們全是霸面的,凡事有正式通知面試的同窗直接被送到裏面房間掃碼簽到等待。跟我帶路的是騰訊的小哥哥,面帶微笑詢問我是面試什麼崗位,我說後臺,他臉上的表情很豐富,很是驚訝我做爲一個女生來面後臺!我說我是本科生,他的表情更加誇張了......驚訝轉佩服,他估計是佩服個人勇氣,說看好我並未我加油。多線程
簽到後,裏面房間的位置也就坐着一個同窗在等待面試,我徑直走到他旁邊的位置坐下,主動跟他搭話,他是面試前端的研究生,一邊跟我說着話一邊不停地敲着鍵盤,看他很專心地在研究他的代碼,我也就沒再打擾了。靜坐了一分鐘左右,又進來一個男生,坐在咱們後面的位置,主動向咱們兩個搭話,他是來複試後臺的重慶大學研究生,旁邊男生一聽是後臺,立馬讓我跟他好好交流,我也很識趣地移到後面男生的旁邊坐下。這個男生很nice,得知我是本科生,看了看個人簡歷,而後向我分享了他的經歷——他在本科畢業以後也向我同樣來面試了騰訊,可是被拒,拖了一年後開始準備考研,考了兩次以後成功考上了重慶大學的研究生,直到如今他本身手上已經有其餘公司的offer,而後再來面試騰訊。言語之間已經感覺到他十足的信心了。可能以爲這個時候的我很像當年的他,因此給了我不少建議。還沒來得及互相留聯繫方式,他就被叫去面試了。他走後立馬又來了一個複試後臺的重慶郵電研究生,坐在我旁邊,得知我是一面且是本科生,再也不感興趣,因而掏出手機開始看資料,一邊看一邊告訴我讓我看看XXX,一面可能會被問到。不怕丟臉,講真的,他說的那兩個名詞我都沒聽過......這也許就是本科生和三年研究生的差距吧!併發
終於輪到我面試了,地點是7樓,走出等候室,仍然是剛剛的小哥哥給我帶路,幫我刷卡按電梯,並一直誇讚和鼓勵我,我苦笑一句說我本身也以爲很意外,並且我看過來面試的都是研究生,他很溫柔地告訴我不要緊,面試官對研究生的要求和本科生的要求是不同的哦~最後送了我一個微笑和好運祝福後讓我關上了電梯門。ide
電梯到達7樓,作了一次深呼吸後,我面帶微笑走進了726房間,面試房間的佈局和我想象中的同樣,面試官的狀態也和我想象中的同樣 —— 一副剛起牀的狀態!面試官坐在書桌的電腦前等個人到來,我在走向他的途中用餘光掃到旁邊牀上被子是凌亂的,牀邊他的靴子東倒西歪並向外吐着襪子,牀頭櫃上還有打開未吃完的薯片。面試官看起來沒有很好相處,我會這麼以爲,大概是由於他沒有迴應個人微笑吧。從進門開始我就介紹了我本身的名字,並一直面帶微笑。函數
面對着他坐下後,首先被要求作個簡單的自我介紹,名字+大學+專業,而後說明我是深圳過來重慶面試的,他很驚訝我來自深圳,同時也很好奇,我本來覺得他是知道我9月份在深圳已經面試過的,並且對於每一個已經面試過的同窗面試官都會寫一份評語,我也覺得他已經看過評語,看他的反應大概是什麼都不知道,因此我作了一個詳細的說明以後便接着個人自我介紹模版說下去。待我說完,他估計是看到了以前面試官對個人評語之類的,沒有再問我簡歷上的內容,直奔主題——作題!一共作了三道題。佈局
第一道題是算法設計題:有N個數組,每一個數組有M個元素且呈升序,求這N個數組的並集。例如:第一個數組有{1,2,3},第二個數組有{2,3,5},則合併後爲{1,2,3,5}。
(1)我首先想到的是犧牲空間節約時間的辦法,申請一個超大的數組A,初始化爲0,遍歷這N和數組,將元素做爲A數組的下標訪問A數組並置1;N個數組訪問結束以後,再遍歷一次A數組,其中值爲1的下標的集合就是合併後的結果。聽我講完,他首先問我時間複雜度和空間複雜度,時間複雜度是O(N*M),空間複雜度是元素的取值範圍。面試官提示我本道題是在64位系統下實現,而我須要的空間大小爲元素取值的範圍,也就是說最多能達到2^64遠大於1Gb,因此這個方法是不可行的。
(2)我知道我一直沒有利用到「有序」這個關鍵詞,因此我抓緊這關鍵詞,首先想到的是二分查找:以兩個數組A、B合併爲例,以A數組爲基準,遍歷B數組的元素,利用二分查找,將B的元素在A中找到最適合的位置,
說完思路,他接着問我,那N個數組怎麼合併呢,我回答的是遞歸拆分,直到只剩兩個數組爲止,而後再逐次往上合併。回答完遞歸後,我本身都以爲太過複雜了。他繼續問了下時間和空間複雜度,兩個數組合並的時間複雜度主要取決於二分查找的複雜度O(logM),總共要找M個關鍵字,因此兩個數組合並的複雜度是O(MlogM),再加上N的數組的遞歸拆分大概就是O(N*MlogM)的複雜度了,空間複雜度爲常數。能由「有序」關鍵詞想到了二分查找,面試官也勉勉強強接受了。
(3)我看他的表情不太滿意,因而我主動表現出對巧妙方法的興趣與渴望,因而面試官就給了我一個提示:「就以你兩個數組爲例,你每次無非就是在確認一個數。」靈光一閃!我知道了!
那麼N個呢?遞歸的話容易實現,但不必定是最好的,若是每一個數組一個指針會不會空間太大呢?只有N個數組,只須要N個指針,N個指針同時進行比較,每次找最小的一個數記錄(問題簡化了,至關於在N個數中尋找最小的一個數)。顯然N的指針更佳使人滿意。那這N的指針如何進行比較?我先說的是快排的拆分函數(以一個數爲基準,比該數小的在左邊、大的在右邊),而這個基準數是隨機的,因此調用一次拆分函數,返回函數中基準值下標,若是下標大於1,再對下標的左邊部分繼續調用函數;若是下標小於等於1,直接返回下標爲0的元素。這樣的作法減小了遞歸次數,沒必要使得整個序列有序。可是這個作法仍是不能讓面試官滿意。N個數中,只是找一個最小的數,我還能想到的是堆,可是我對於堆不熟悉,只知道當記錄數不少的時候用堆最合適。我也是這樣同跟面試官說的,最後再次問了時間和空間的複雜度,我理解的堆排序時間複雜度是O(nlogn),可是這個複雜度是將整個序列變得有序的複雜度,而咱們只須要找一個最小的,因此個人回答是,若堆排序的時間複雜度是X,那麼這種解法的時間複雜度是O(N*M*X),空間複雜度爲常數。
第二道題是寫代碼,讓我寫出迴文數的代碼實現,給了我一個函數的定義,讓我實現該函數。固然我會故意問一位數的數字算不算迴文數!這道題沒什麼難度,因此我鎮定自若地寫,也把全部邊界狀況都考慮到位。寫了一個最簡單的代碼:
1 //-1:異常 2 //0:不是迴文數 3 //1:是迴文數 4 #define N 100 5 int Palindromic(int value) 6 { 7 int x = value, k = 0 ,start, end; 8 int a[N] = {0}; 9 10 //拆分數字,將每一位存放進一個數組 11 if(x==0) 12 return 1; 13 while(x!=0) 14 { 15 a[k++] = x%10; 16 x = x/10; 17 } 18 19 //從兩頭開始比較 20 start = 0, end = k-1; 21 if(start > end) 22 return -1;//不可能發生 23 else if(start == end) 24 return 1; 25 else 26 { 27 while(start<end && a[start]==a[end]) 28 { 29 start++; 30 end--; 31 } 32 if(start<end) 33 return 0; 34 return 1; 35 } 36 }
後來仔細想一想之前的代碼,還有更簡單不易錯的代碼:
1 //0:不是迴文數 2 //1:是迴文數 3 int Palindromic2(int value) 4 { 5 int x = value; 6 int remainder = 0; 7 int reverse_value = 0;//反轉數字初始化爲0,使得value=0時函數也成立 8 while(x!=0) 9 { 10 remainder = x%10; 11 reverse_value = reverse_value*10 + remainder; 12 x = x/10; 13 } 14 15 if(value == reverse_value) 16 return 1; 17 18 return 0; 19 }
第三道題他說是設計題,讓我設計一種方法來測試服務器的壓力,聽完他的題目說明,我是一臉萌比的,大概是問的「假設:服務器tps=100000,怎麼測試服務器壓力」,很尷尬的向他求助,能不能給點提示,他又說「假設一個線程tps=1000」,結合他的提示,我只能把與相關的知識所有說出來,如線程的通訊方式:(1)管道(2)系統IPC(信號量、____、消息隊列)(3)套接字Socket,其中漏了一個,由於這個問題毫無頭緒,我已經有點着急了,接着繼續說,要想達到100000的tps,確定須要多個線程,我想用信號量來實現,例如我100個進程就能達到想要的tps的話,我給這些進程100個鎖來實現。他忍不了,說用共享內存來實現多個進程的通訊更快,我恍然大悟,哦!!我遺漏了共享內存......我急忙贊同他的說法,他又接着問我這多的線程要怎麼管理呢?這...我只能認輸不知道。他告訴我,須要用一個線程來管理其餘多線程的併發操做。
後來本身百度了下這個問題,原來是WeTest的測試大師http://wetest.qq.com/gaps/
三個問題問完以後,對於面試結果,我內心仍是有點B數的,面試官並無走流程讓我問他問題,說今天的面試就到此吧。我起身拿起包打算離開,但仍是很像問他問題,因此我先問他我可否向他提一個問題,他贊成以後,我問他咱們這樣的本科應屆生有什麼建議和意見嗎?他仍是很耐心的跟我講了一些對應屆本科生的建議,最後說我閱歷太少,經驗不夠,基礎功不紮實。我回應了幾句,並向他表示了真心的感謝以後離開了房間。
面試官的評價很到位,赤裸裸的現實,仍是回校補補養分吧!不過這份經歷仍是值的,一個毫無經驗的應屆本科生同幾個研究生來競爭一樣的職位,雖然結果很明顯,但仍是很是感謝面試官給我這個面試機會,並且整個面試過程當中還那麼耐心的引導我!
個人博客即將同步至騰訊雲+社區,邀請你們一同入駐。