一面(6.24妓布,2h30min,體驗很好)
問:介紹一下自己
答:略
問:你現(xiàn)在研究生是在做哪方面研究
答:略
問:你這個項目是用多線程的宋梧,那你覺得多進程和多線程各自優(yōu)缺點有哪些
答:1.多線程切換比多進程快 2.多線程共享資源方便匣沼,進程則需要進程間通信 3.(他提醒了我才想起來)多進程地址空間獨立,一個崩潰了其他的不受影響捂龄,多線程則會全崩潰
問:我看你的項目里面提到eventloop释涛,它一般是用epoll實現(xiàn)的,你知道epoll的兩種模式嗎
答:知道跺讯,有邊緣觸發(fā)和水平觸發(fā)枢贿。比如監(jiān)聽可讀事件時,邊緣觸發(fā)是緩沖區(qū)由空到非空刀脏,水平觸發(fā)是……(大家自行谷歌吧)
問:那你的項目中使用的是哪一個模式局荚,為什么
答:使用的是水平觸發(fā),因為邊緣觸發(fā)的情況如果不讀完則不再觸發(fā),而水平觸發(fā)就算不讀完也會再次觸發(fā)耀态,這樣不容易漏掉數(shù)據(jù)轮傍。
問:但是其實是邊緣觸發(fā)的性能更好
答:是不是水平觸發(fā)觸發(fā)會比較多系統(tǒng)調用次數(shù),那其實也可以一次讀完首装,而不是多次觸發(fā)(他不置可否创夜。。仙逻。想說什么又沒說)
問:那你除了epoll驰吓,知道select和poll嗎,說說它們底層有什么不同
答:select……系奉,poll……檬贰,epoll底層有一個紅黑樹,因為它要支持頻繁的增刪改缺亮,有事件到來時將就緒事件放入隊列翁涤,然后再拷貝到用戶態(tài)
問:那為什么是用紅黑樹而不是用平衡二叉樹呢
答:(自行谷歌)
問:高并發(fā)的場景容易產生內存碎片過多的問題,你知道原因以及怎么解決嗎
答:(這題我真不太懂萌踱,就扯了操作系統(tǒng)中的內存分配機制葵礼,但是明顯不是他想聽的。 唉并鸵,這個內存碎片這塊確實答得不好)
問:你說的是系統(tǒng)級的鸳粉,我想問應用層面怎么做,emm园担,或者你知道STL里面的內存模型嗎赁严?
答:比如說vector? 他就是當目前可用內存不夠的時候去重新申請原來的兩倍的內存,你是想說一次拿比較多的連續(xù)內存嗎
問:嗯粉铐,這就是預分配技術,那你知道內存池技術嗎
答:聽過但是沒用過卤档,(開始瞎編)它應該和線程池有類似的地方吧蝙泼,就是資源重用,用完的內存放回池中劝枣,下次就可以直接使用而不用重新申請
問:這是一方面吧汤踏,(接下來他科普了幾句內存池,不過我記不大清了)
問:你平常用哪版C++(答c++11)舔腾,c++中內存的釋放是個棘手的問題溪胶,所以在c++11里面提供了智能指針,你說說這幾種智能指針的作用還有怎么實現(xiàn)的吧
答:(常見問題稳诚,還是自行谷歌吧哗脖,不過實現(xiàn)方面我也就share_ptr說的比較好)
問:你剛剛說share_ptr是在析構函數(shù)中判斷引用計數(shù),決定要不要釋放,那我問你我們一般把析構函數(shù)寫成虛函數(shù)是為什么
答:動態(tài)綁定時如果基類指針如果指向派生類對象才避,不是虛函數(shù)的話只會調用基類析構橱夭,而是虛函數(shù)的話就能正確調用派生類的析構
問:網(wǎng)絡里面tcp是比udp可靠的一個模式,你說說tcp的哪些機制使得它可靠
答:1. 基于連接桑逝,需要有三次握手 2.握手時交換了初始序號棘劣,而序號是保證有序的方式 3.超時重傳機制 4.滑動窗口保證不會發(fā)送超過對方負荷的數(shù)據(jù) 5.擁塞控制,有慢啟動有擁塞避免
問:數(shù)據(jù)庫的話mysql比較熟是吧楞遏,那你知道數(shù)據(jù)庫的索引一般用哪種數(shù)據(jù)結構嗎茬暇?
答:(先說了B樹,再說了B+樹寡喝,資料很多自行谷歌吧)
(做題時間糙俗, 50分鐘,做的不大好)
- 代碼題拘荡。設計并實現(xiàn)整數(shù)轉字符串函數(shù) char * itoa ( int value, char * str, int base ); base表示轉換的進制臼节,如17進制
- 代碼題。給定uint32_t A[n] (1<n)珊皿,求max(A[i] & A[j]),其中i != j
- 思路題瞭恰。超過100億的無序可重復的unsigned int,給定4G的內存鸵隧,如果找到中位數(shù)鹃两?
- 思路題。給定n個樣本文件(每個文件從書籍驶兜、報刊等提榷笾佟),平均長度為k個字節(jié)抄淑。根據(jù)給定的樣本屠凶,給出判斷一個輸入的數(shù)據(jù)串是否為隨機串的算法。
- 其實我也就第一題做的比較完美肆资。
- 第二題在最后五分鐘才想出O(n*bitsof(uint32))的算法矗愧,不過雖然沒寫完代碼但是和他講了我的思路他也表示可以。
- 第三題沒想出來郑原,說了個計數(shù)排序唉韭,搞個map用于value到次數(shù)的映射。但是我知道內存并不允許犯犁,后來在他的誘導下想出來了(他一直強調属愤,想想怎么限制key的個數(shù))
- 這題我大概說了一下統(tǒng)計樣本中字符概率,以及a字符在b字符后面的概率酸役,他說你這個思路算是有的住诸,有沒有聽說過馬爾可夫模型驾胆,我說知道但沒有學,他說這題就可以用馬爾可夫
二面(7.7只壳,1h30min俏拱,體驗極差,已涼涼)
先吐槽一下吼句,二面和一面的面試官完全兩種風格锅必,二面面試官在我答題過程中基本不給反饋,導致有些回答就算答對了我也是心慌慌惕艳,總之特高冷搞隐,幾乎沒得交流。另外我也是憨憨远搪,之前看過微信的面經(jīng)劣纲,可是卻沒有認真去搞懂每個題目,導致我這次面試很被動谁鳍。
問:項目介紹癞季,遇到什么問題,reactor線程怎么做到不會阻塞倘潜,線程之間相互喚醒怎么做等等
答:這部分略吧绷柒,感覺答得還行
問:是在linux開發(fā)的嗎
答:我編寫代碼的話是在windows上用clion配置了遠程編譯器的形式寫的
問:那linux是不會嗎
答:(大哥,我真的沒有這意思啊大哥)不是啊涮因,雖然不敢說很會废睦,但是至少基礎的還行吧,我去年實習也做過linux相關的工作养泡,而且這次做這個項目也又學了挺多
問:腳本會寫嗎嗜湃,a...(好像是a開頭的某個單詞)有些過嗎
答:會寫簡單的shell吧,復雜的可以用python寫一寫澜掩,不過你說的這個我倒沒寫過
問:數(shù)組名和指針區(qū)別
答:sizeof區(qū)別购披,傳參時數(shù)組名退化成指針(然后我就不知道從哪些層面考慮了,面試官一聲不吭肩榕,留我自己在那瞎著急)
問:c++里面的復制構造函數(shù)什么情況下調用
答:直接顯示調用復制構造函數(shù)今瀑;按值傳遞參數(shù)時,會觸發(fā)復制点把;按值返回時,也會觸發(fā)復制屿附; (面試官沒反應啊郎逃,咱只能繼續(xù)想) 還有比如vector調用push_back添加一個對象時也會復制的吧 (面試官還是沒反應啊,真就心慌慌挺份,又過了會才說下一題)
問:2個廣告位褒翰,5個廣告,每次刷新時返回兩個廣告,給定5個廣告的概率优训,問如何按給定概率返回2個廣告
答:(我一開始可能緊張沒聽清楚以為是五個廣告平等概率朵你,說了隨機或者拿到所有組合,他終于給點反饋了揣非,說這樣能符合給定概率嗎并且每次隨機兩次的話可能兩個廣告是一樣的抡医,我才反應過來有給定概率)
后來我一直在想怎么組合,先按概率從小到大排序早敬,概率小的和下一個概率大的組合忌傻,但是始終有漏洞會有兩個廣告可能是同一個的漏洞。就這樣想了挺久搞监,直到他說下一題
(到這里已經(jīng)有點心態(tài)不好了水孩,不僅因為沒想出來還因為這題我之前見過,當時卻沒有認真思考)
問:給一個不規(guī)則封閉曲線上的所有坐標琐驴,判斷輸入的坐標在不在封閉曲線內部
答:(我大概記得做直線的方式)想了會想到一個不嚴謹?shù)乃惴ǎ梢酝粋€方向做條射線绝淡,和邊的交點數(shù)奇數(shù)則在內部宙刘,偶數(shù)則在內部。這里不嚴謹是沒有考慮相切够委,于是我不敢回答荐类,又想了挺久不知道怎么解決相切情況,實在沒辦法才講了這個不嚴謹算法
他果然高冷的畫了一條線茁帽,說這種情況(相切)就不對玉罐。
于是我又想了幾分鐘,到這里已經(jīng)心態(tài)爆炸潘拨,面紅耳赤吊输,幾近崩潰,大腦空白了铁追,于是我自己放棄了
(做題時間)
三題按順序寫季蚂,寫完一題發(fā)一題,盡量快
我的解題就先不寫了琅束,我總共花了40分鐘扭屁,感覺有點慢了
- 實現(xiàn)大小寫無關的C字符串比較
int strcasecmp(const char *s1, const char *s2);
說明:同strcmp的返回值 , 相等 返回 0涩禀,s1大返回1料滥,s2大返回-1 - 給定一個遞增循環(huán)整數(shù)數(shù)組,從里面找出最小的元素艾船,使用的算法越快越好葵腹。特別地高每,最小的元素可能出現(xiàn)在數(shù)組中間。比如:50, 52, 63, 90, 3, 8, 15, 44践宴。
int findmin( int array[], int count );
說明:遞增循環(huán)整數(shù)數(shù)組指如果首尾成環(huán)鲸匿,在環(huán)的某一個點開始是遞增的。 - 已知一棵二叉樹阻肩,結節(jié)類型如下带欢,val每節(jié)點不同。
struct Node{
struct Node left,right;
int val;
} ;
給出三個存在于二叉樹中磺浙,且互不相同的整數(shù)洪囤,求該三個整數(shù)對應的二叉樹節(jié)點的最小公共祖先。
Node * getAncestors(Node* root, int a, int b, int c)
{
}
說明:1.這是一棵普通的二叉樹撕氧,沒有排序瘤缩;
2.三個數(shù)均在二叉樹中,不用考慮不在的情況伦泥;
3.二叉樹中每個節(jié)點的值不同剥啤,不用考慮有相同值的情況