字節跳動一面c++視頻面試(第二個部門,效率工程部門)(一面通過)

小哥邊記錄邊面試,對於我這菜雞也挺友好的。由於面試官提前說好了邊面試邊記錄,所以整個過程持續了一個多小時。

自我介紹後

1.如果兩個數字以鏈表形式給出,高位在前低位在尾部,怎麼實現加法。(不允許修改數據結構的話)

我:如果考慮O(1)空間複雜度的話,可以先將兩個鏈表翻過來(這樣應該很容易吧),然後從頭向高位加,考慮進位,然後考慮是不是多一個進位什麼的。

問:怎麼處理進位呢?

我:弄個變量記錄一下

問:必須用變量記錄嗎?

我:(被這個問題問的有點蒙)不用變量的話可以直接加到高位上,但是這樣可能實現起來**&%@,總之用個變量統一一點(說的自己也有點蒙)。

問:那能不能不翻轉鏈表方向呢?

我:不翻轉的話可不可以是O(n)的空間複雜度呢?如果是O(n)的話,可以用數組先把數字存起來,也可以用棧來翻轉順序。

(從此就再也沒問過算法、數據結構。。。。。。)

2.你有什麼項目經驗嗎?(這個問題問了好幾遍)

我回答聊天室和tx的libco學習。(實在是拿不出手)

那聊天室用的什麼通訊協議?  TCP

2.5講一下tcp三次握手,然後問了個tcp求延時的問題我也沒搞懂。

3.瞭解HTTP協議嗎?

我:不太瞭解。

問:......*&^%*&   說一下post和get....

我:只知道是協議頭部的一個字段,具體沒實現過。。。

(面試官非常戀戀不捨地結束了http的話題,甚至後來欲言又止又想問。。。)

4.數據庫瞭解嗎?

我:(http把我打的屁滾尿流,數據庫雖然不是很瞭解,至少開過這門課,就先說了解過一點吧)

然後給我出了個題

有一張表,表頭分別是(商品名,訂單日期,訂單狀態),其中訂單狀態是枚舉類型{已付款,未付款,異常}

假如數據量比較大(一千萬)

有四種查詢操作:

A.查詢某商品所有訂單

B.查詢某天(忘了是某天還是某日期)所有訂單

C.查詢某狀態所有訂單

D.查詢謀商品最近一個月的訂單

需要比較高的查詢效率,怎麼設計這個表

我:只有一張表嗎?

答:是的。

我:(一張表的話,就可以排除各種範式了,提高效率就考慮索引。但是索引怎麼加我還是一頭霧水,所以......)我對數據庫不是很精通所以我可以先從數據結構的方向答一下嗎?

如果是考慮效率的話,那可以考慮用空間換時間,數據保存三份,對於第一種操作,在第一份數據裏以商品名稱排序,這樣就可以以O(m)的複雜度(其實這裏說錯了,應該是O(logn+m))查詢到數據,第2,3個查詢同理,對於第四種查詢,那就按照名字和日期聯合排序。

那對於數據庫的話,提高效率加索引吧,額嗯...大概三列都要建索引的樣子。

面試官:三列都要建索引嗎?

我:額.....

面試官:其實第三列是個枚舉類型,不太合適沒有必要建立索引。

我:嗯嗯嗯......

面試官:以第一列和第二列建立聯合索引就好了。

我:嗯嗯嗯......

面試官:那....嗯....你瞭解過主鍵是幹什麼的嗎?

我:可以唯一確定一個元組的(當時也沒用元組這麼專業的名詞),而且數據庫自動在主鍵上建立索引。(大概是這麼回答的)

面試官:那本題這個表誰可以當主鍵呢?或者都不能當主鍵?

我:產品名....不行...(思考若干秒鐘,小聲嘟囔)。三列加起來可以當....不對。(大聲回答,雖然略有心虛)如果是考慮嚴謹的話,就算是時間精確到一定精度,也可能會有兩個訂單擁有相同的(產品名,日期,狀態),所以這個表不完整,都不能當作主鍵。得再加一個訂單ID之類的東西吧。

面試官:訂單ID是麼.....(敲鍵盤記錄着什麼)

 

然後面試官又想問一點http,好像是突然想到我不會http硬生生地收回了40米大刀。

“你報的崗位是c++....是吧,那再問一下你c++吧"

5.內聯函數了解過嗎?

我:“瞭解過,關鍵字是inline,相當於把函數直接複製粘貼到了調用處,函數調用的時候有一些問題比如說:調用、返回的時候保存還原上下文(比如說寄存器啊斷點啊什麼的),需要時間代價,還有調函數可能會導致緩衝不命中造成大量的時間代價。所以對於簡小精悍的函數寫成inline可以減少開銷。但是如果inline函數比較大的話,多次複製粘貼會導致編譯後代碼過長,浪費內存。(還有其他問題我並不是太懂所以沒有講),總之inline函數跟宏定義有點像吧。大概就是這樣子。”

問:那inline跟宏定義函數有什麼區別嗎?

我:。。。。(真是自作孽不可活,我幹什麼提宏定義)額,宏定義是定義,inline是函數,emmmmm,用起來的話宏定義一般不能寫的那麼多。其他的就不懂了。

(之後又提到了inline函數)

6.虛函數和純虛函數有什麼區別嗎?

我:虛函數有函數體,可以被調用。純虛函數沒有函數體只是一個聲明,不能被直接調用,可以當成一個接口約定來用吧。而且純虛函數一定要被重寫覆蓋。之後他倆都會被寫到虛表裏。

問:如果虛函數被定義成內斂,那麼它會被寫到虛表裏嗎?

我:。。。一通推測,然後說沒了解過涉及到知識盲區了。

面試官:那你說一下你推測吧,根據已有的知識。

我:(既然這樣那我就大大方方推測一番)。inline的話會被複制到各個位置,那麼它就沒有一個明確的函數頭地址,就沒法寫到虛表裏。嗯,我推測:不會。(腦海裏記得函數體寫在類內的成員函數是默認inline的,然後所以不確定,很迷,事實證明這個憂慮是有道理的,實際情況是兩種都有。本作者在這裏胡bb各位請諒解

ps:事後問了度娘和CSDN博客大神,是這樣的:(我也忘了面試官一開始咋問的了,雖然有點跑題但還是請看官大人多多包涵)

如果這種函數是被指針調用的,比如p->func();由於動態聯編的關係編譯器不能確定func函數到底是誰,所以不會inline,而如果是被實例調用比如說:p.func(),那麼編譯器就能確定它是誰,就可以inline。

6.你提到libco,那你能說一下libco是幹嘛的嗎?

然後胡說一通

問:你提到單核多核,那libco是單核的嗎?

我:是的。

問:那你提到高併發,那他是怎麼提高併發能力的。

我:(內心想,聲網的面試官也是這麼問的)此處省略一大段話。

問:你還是沒說清怎麼高併發。比如說我現在接收到了一百個請求,我一個一個處理和用libco處理*&…………%&……

我:嗯,我先說一下我的一個理解,就是:如果是計算密集型的,適合單線程,如果是計算不密集型的然後是等待比較多,適合高併發多線程之類的東西。如果是您說的每次都要一百個請求的話,那就相當於計算密集型的了。然後舉個聊天的例子*&*(*……&%),面試官不太認同的樣子。

最後跟面試官扯了半天。

7.你提到協程間不需要鎖機制,那你講一下鎖是幹嘛的。

8.知道const嗎?const和define宏定義的變量有什麼區別。

8.5static?static和const的內存地址會變嗎?

9.你知道c++中自帶的鎖嗎?(mutex和讀寫鎖)自旋鎖知道嗎(不知道,對於其他所我只是聽說過沒有深入瞭解過,比如自旋鎖啊,遞歸鎖啊什麼的)

應該還有一些題,有點記不起來了,就先到這兒吧....

面試下來又雙雙叒叕一次感受到自己太太太太菜了。所以本來是不想寫這個博客的。

最後還是硬着頭皮寫下了這一篇,以備以後複習用吧......

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章