1. 程式人生 > >今日頭條面試題

今日頭條面試題

       本寶寶從來沒想過會去頭條面試,但是莫名的收到了頭條HR的電話,問我是否在找實習,什麼時候有時間可以面試,既然已經約好面試的時間,那還是要好好準備一下,為了準備頭條的面試,把網上關於頭條的所有面試題刷了一遍,並且順利的通過了一面和二面(雖然全程都是都程式寫程式碼,其他的什麼都沒問,全程被兩個面試官虐了兩個小時四十一分鐘)順利收到了三面的通知,以為這一面可以面一些網路方面,作業系統方面的,沒想到三面面試官一上來就出演算法題,我很快就寫出來了,讓我講一下 tcp  ip http 本寶寶巴拉巴拉一頓,面試官就開始問專案,嫌棄我的專案,因為本寶寶是通訊專業的,所以做的專案也是偏於通訊的,三面僅僅面了三十一分鐘,最後把我刷掉了,雖然他把我刷掉了,但是也讓我明白了找網際網路工作是需要網際網路方面的專案經驗,現在已經每天都在做網際網路專案,撒一波福利,希望秋招可以去我心心念唸的那家公司。。。。(我是打不到的銅豌豆)

本寶寶心心念唸的公司也嫌棄自己的專案太理論化,心心念唸的公司一面面了一個小時二十一分鐘,最後被掛掉了,你知道到嗎,心心念唸的那家面試官太好了,給我講要怎樣做網際網路的專案,掛掉電話的時候我居然莫名的留下了眼淚(我相信在經過四五個月的錘鍊,我是可以去那裡的)。所以筒子們如果想轉行走網際網路這條路要多實踐,不要天天看書,刷題,這些是遠遠不夠的。

這是本寶寶在準備頭條時,把所有題仔細刷了一遍,而最終無果,筒子們雖然春招實習我最終只收到一家的offer(目前已經不想去實習)幾乎所有的都嫌棄我的專案,筒子們如果面試失敗了,不要灰心,不要失落,堅持下去,最後一定會有結果的,就像我的好朋友和我說的那句話:一切都是為了最好的準備,

現在你所經歷的,可能就是為了最好的那家,最適合你的那家要經歷的,只有經歷了,你才會知道有哪些不足,好了筒子們,我就不再囉嗦了,下面是頭條的面試題目:

n個整數的無序陣列,找到每個元素後面比它大的第一個數,要求時間複雜度為O(N),在面試官提醒下寫出來了,用棧+棧底指標

介紹5種IO模型

非同步程式設計的事件迴圈

作業系統為什麼要分核心態和使用者態

為什麼要有page cache,作業系統怎麼設計的page cache

STL裡resize和reserve的區別

擼一個std::lower_bound,不斷優化,直到最壞複雜度也為O(logN)

C++11新特性

怎麼實現執行緒池

用到哪些C++的新特性

怎麼喚醒,排程執行緒

什麼是LRU快取

怎麼設計的LRU快取,詳細

實現一個二叉樹的持久化方案,可以虛擬碼,必須用指標

主要是序列化和反序列化的過程

(卡在指標的持久化,然後他不是很滿意,說我應該做得出,然後我只能把我的另一種不用指標的方案給他講,才算勉強過)

實現二叉樹的層序遍歷再按層輸出

tcpudp的區別

http的啟動方法,沒答出來

演算法題:二叉樹層級遍歷,以及follow up是每下一層遍歷方向顛倒

hashmap實現原理,衝突等

演算法題:二叉樹最小公共祖先【一開始問的是一棵樹裡最遠的兩個節點間的距離,思考的有點久於是換題了...】

演算法題:連結串列成環判斷

演算法題:連結串列交叉判斷

http請求的組成

get,post的區別

怎麼解決hash衝突,然後讓我講講Http協議,好像講的不太好,第一題好像是個連結串列的,幾下寫完了,然後面試官又丟擲一個合併k個連結串列,我的做法是用最小堆去維護,然後面試官說可以,第三題好像是按照字典序列印1~N的排序,從1開頭比N小的數開始列舉就好了,也不難,期間面試官說去開會,讓我寫完打他電話,應該在10分鐘左右debug完成,面試說這面通過,第二天HR打電話說安排下一輪,時間還是一週後同一天

· 程序執行緒的區別(這個問得比較細,不只是簡單的記憶體共享之類的,還包括作業系統的程序描述,寫時複製,作業系統啟動等問題,推薦《深入理解計算機系統》)

· epoll,IO多路複用,聊到nginx的原理,和Apache的區別

· 常見的網路攻擊方法,比如跨站指令碼,sql注入之類的

· Https,非對稱加密等

· 一個秒殺系統的架構,包括CDN,反向代理,session共享,由於分散式資料庫我不熟,所以資料一致性那部分沒有解決。

· Hashmap的實現原理,優化方法(其實JDK 8已經用二叉樹替換連結串列了,思路差不多就是這個)

· 腦筋急轉彎,1000桶牛奶,1桶有毒,用10只小白鼠試出來。其實就是二進位制,網上有答案,提示:2^10 = 1024.

3.OSI 7層協議?有哪些是可靠的網路連線?TCP為什麼是可靠連線?cookie vs. session

 Linux命令:檢視埠的的命令(此處忘記耍帥,<(^′)>),檢視cpu/記憶體, 檔案許可權管理(chmod)

執行緒池的原理

給一個數組返回最小堆(把核心程式碼寫出來了,但是面試官好像不怎麼看,讓我輸入測試下。我又寫了半天輸入輸出,連續面了三個小時,加上對好久沒寫了不熟悉弄了半天,他不承認我寫出來了。。喪) 

    最小堆的插入時間複雜度

    二分查詢的時間複雜度怎麼求出來的,怎麼證明。

    malloc函式,你所知道的一切。(只記得一點點了)

httphttps的區別(沒有答的很好)快速排序的時間複雜度,為什麼是nlogn,最壞的情況是什麼,最壞情況下的時間複雜度是什麼。

給一些資料,使用LRU計算命中次數,並用編碼實現

2、說一下自己值得分享的一個專案

3、繼續問了https的原理是什麼

4tcp連線的過程

·      介紹I/O複用技術,epoll優於select的原因

·      介紹執行緒池

·      圖的鄰接矩陣和鄰接表的表示,鄰接表的資料結構。敲程式碼不執行

  • 介紹C ++記憶體管理(C ++的記憶體模型是熱門問題
  • 對檔案系統的瞭解

·      · 演算法題1:給定陣列,快速求出所有數右邊第一個比其大的數。回答思路

·      · 演算法題2:給定k個數組,每個陣列都是有序的,且每個陣列最大值-最小值<1000,1<k<1000,求所有數的中位數。回答思路

·      · 程序與執行緒區別

·       ·  STL記憶體分配

·      一棵樹上路徑和為固定值的那些路徑

·      歸併排序

·      封裝、繼承、多型

·      c++c的區別,和現有更高階語言的區別

  • 二分查詢
    • 無重複元素的二分查詢
    • 含重複元素的二分查詢
  • 找第k大數
    • 快排實現、堆實現
    • 進階:不用額外空間,儘可能快的找到第k大數

·      兩個棧實現一個佇列、怎麼優化

·      陣列每一個元素找出陣列右邊第一個大於自己的數

·      實現LRU

·      TCP四次握手

·      滑動視窗、視窗大小

·      執行緒與程序區別

·      什麼是執行緒安全

·      樂觀鎖、悲觀鎖

·      程序間通訊

·      管道怎麼實現

·      左連線、右連線

·      索引、主鍵的區別

給定n,將1,2,,n按字典序排列,求第k大的數

·      求兩個有序陣列前K大的數

·      拓展:求m個有序陣列前K大的數

·      設計一個帶有有效時間TTL的KV儲存系統,包含set(key,value,ttl)、get(key)方法、怎麼優化

·      迴圈有序陣列的二分查詢

·      手寫繼承實現

·      2.洗牌演算法

·      3.柯里化實現

·      4.陣列去重(寫出一種遠遠不夠,3種方式)

·      .同步和非同步,阻塞和非阻塞

·      7.瞭解http 2.0麼?多路複用在非IO阻塞中有沒有用到?

·      求解兩個棧模擬佇列

·      2.求解一個區間的和乘以這個區間最小值的最大值?單調棧,個人很久沒有刷題了,這道題複雜度用的比較大

·      3.求解一個矩陣中找一條最長的遞增路徑?好像是用DP做,個人用有向圖DFS和記憶化搜尋處理

·      1.引用與指標的區別

·      2.c++與java的區別

·      3.實現hashmap,怎麼擴容,怎麼處理資料衝突?怎麼高效率的實現資料遷移?

·      4.TCP三次握手各個的狀態和傳送的包

·       tcp 斷開連線的各種狀態變化,tcp擁塞控制演算法的詳細介紹,tcp\udp區別

·       熟悉的Linux命令
Linux:統計文字中有多少行
TCP擁塞控制

  1. 寫程式碼:多執行緒實現從A,B,C三個檔案中讀取檔案放到D檔案中,優化:如何同步實現
  2. 多執行緒中有哪些鎖
  3. 寫一個單例模式,什麼時候用到,還了解哪些設計模式,裝飾者模式是什麼,舉例
  4. 異常:見過哪些異常,classCastException是什麼異常,在什麼時候出現
  5. 演算法實現:求陣列最大連續子序列
  6. 計算機網路:post和get的區別
  7. 執行緒和程序的區別
  1. 執行緒的狀態
  2. 介紹死鎖和如何避免
  3. 三次握手
  4. 介紹http tcp
  5. 輸入url,到瀏覽器顯示的過程
  6. gc
  7. 演算法實現:單鏈表旋轉
  1. 寫程式碼:找出字元陣列中只出現三次,且最早出現完三次的字元(eg:aabcbba輸出b)

2.  hadoop已知每一個點的neighbor,求每一個點的二度鄰居

3.  2. 有一個排好序的陣列,先將其隨機迴圈右移,求在陣列中查詢指定target的位置 lgn

4.  3. 有字串,將所有連續的ac跟單獨的b去掉後的字串:如acccccb->ccc; aacceacdb->ed

5.  時間複雜度O(n) 空間複雜度O(n) --> 時間複雜度O(n) 空間複雜度O(1)

6.  4. 二分查詢,查第一個出現的位置

7.  5. 陣列:找第k大的數 (無序陣列) O(N) -> 陣列無法修改,額外空間O(1) 時間O(N)

8.  6.tcp慢啟動過程

9.  2、寫程式碼 兩個棧實現佇列

10.3、寫程式碼 陣列的最大連續子集(和最大的連續子集)

6、malloc和new的區別

2、寫程式碼  建一個數組迴圈左移N位,最好不要用輔助空間(我最後還是用了= =)

11.3、寫程式碼 複雜指標的複製

12.4、位址列輸入一個url到最後內容出現在頁面上,中間經歷了哪些過程

13.5、stl有哪些容器

14.6、vector的底層實現以及如何刪除內容釋放記憶體的

15.7、有哪些記憶體區

16.8、狀態碼有哪些

17.9、基於UDP和TCP的socket通訊過程 

18.2、寫程式碼  壓縮駝峰字串

19.3、如果四川地區大量群眾都表示無法開啟頭條網站,請說明一下原因

20.4、基於上個問題,我也是半蒙半猜,我說可能是1、頭條伺服器的問題2、運營商的問題3、路由問題

21.然後面試官就問如何測試是否是這三個的問題,瞎答了一波

22.5、如果是自動獲取DNS,那麼如何檢視當前計算機的DNS地址

8、電腦用久了之後開機時間變長,請問有什麼原因

23.9、一道選擇題,題目特別長,關於戰爭時期美國海軍招新宣傳:現在紐約市民的死亡率是千分之16,美國海軍的死亡率只有千分9。

24.讓選擇一個答案,正確答案是:紐約市民中有很多生存能力不高的幼兒和老人(大概是這樣)

25.10、基於上述材料,舉一個生活中的例子。。。。。。。。。。。。。

· TCP與UDP的區別

· TCP與UDP分別應用在什麼方面

· TCP和UDP分別對應協議(應用層)

· 同步和非同步的優缺點

· TCP三次握手四次揮手

· TCP三次握手的缺陷

· 短連結和長連結的特點以及應用在什麼場合

· 樂觀鎖和悲觀鎖

· 自旋鎖是什麼樣的

· 程序同步的方式

· 執行緒池的結構與如何實現同步

· 單例模式多執行緒

·       ·  其他設計模式

· TCP與UDP的區別

  1. 基於連線與無連線
  2. TCP要求系統資源較多,UDP較少;
  3. UDP程式結構較簡單
  4. 流模式(TCP)與資料報模式(UDP);
  5. TCP保證資料正確性,UDP可能丟包
  6. TCP保證資料順序,UDP不保證

· TCP與UDP分別應用在什麼方面

  1. TCP:對效率要求低,對準確性要求較高 (如檔案傳輸、重要狀態的更新等)
  2. UDP:對效率要求高,對準確性要求較低 (如視訊傳輸、實時通訊等)。

· TCP和UDP分別對應協議(應用層)

  1. TCP: STMP, TELNET, HTTP, FTP
  2. UDP: DNS,TFTP,RIP,DHCP,SNMP

· 同步和非同步的優缺點

  1. 同步和非同步的特點
    1. 非同步傳輸是面向字元的傳輸,而同步傳輸是面向位元的傳輸。
    2. 非同步傳輸的單位是字元而同步傳輸的單位是幀。
    3. 非同步傳輸通過字元起止的開始和停止碼抓住再同步的機會,而同步傳輸則是以資料中抽取同步資訊。
    4. 非同步傳輸對時序的要求較低,同步傳輸往往通過特定的時鐘線路協調時序。
    5. 非同步傳輸相對於同步傳輸效率較低。
  2. 同步的好處:
    1. 同步流程對結果處理通常更為簡單,可以就近處理。
    2. 同步流程對結果的處理始終和前文保持在一個上下文內。
    3. 同步流程可以很容易捕獲、處理異常。
    4. 同步流程是最天然的控制過程順序執行的方式。
  3. 非同步的好處:
    1. 非同步流程可以立即給呼叫方返回初步的結果。
    2. 非同步流程可以延遲給呼叫方最終的結果資料,在此期間可以做更多額外的工作,例如結果記錄等等。
    3. 非同步流程在執行的過程中,可以釋放佔用的執行緒等資源,避免阻塞,等到結果產生再重新獲取執行緒處理。
    4. 非同步流程可以等多次呼叫的結果出來後,再統一返回一次結果集合,提高響應效率。

· TCP三次握手四次揮手

· TCP三次握手的缺陷

  1. SYN- Flood攻擊: 通過向網路服務所在埠傳送大量的偽造源地址的攻擊報文,就可能造成目標伺服器中的半開連線佇列被佔滿,從而阻止其他合法使用者進行訪問。
  2. 防範:
  • 無效連線監視釋放 這種方法不停的監視系統中半開連線和不活動連線,當達到一定閾值時拆除這些連線,釋放系統資源。這種絕對公平的方法往往也會將正常的連線的請求也會被釋放掉,”傷敵一千,自損八百“
  • 延緩TCB分配方法
  • 使用SYN 2Proxy防火牆

· 短連結和長連結的特點以及應用在什麼場合

  1. 長連線:
  • 長連線多用於操作頻繁,點對點的通訊,而且連線數不能太多的情況。
  • 每個TCP連線的建立都需要三次握手,每個TCP連線的斷開要四次握手。
  • 如果每次操作都要建立連線然後再操作的話處理速度會降低,所以每次操作後,下次操作時直接傳送資料就可以了,不用再建立TCP連線。例如:資料庫的連線用長連線,如果用短連線頻繁的通訊會造成socket錯誤,頻繁的socket建立也是對資源的浪費。

短連線:

  • web網站的http服務一般都用短連線。因為長連線對於伺服器來說要耗費一定的資源。像web網站這麼頻繁的成千上萬甚至上億客戶端的連線用短連線更省一些資源。試想如果都用長連線,而且同時用成千上萬的使用者,每個使用者都佔有一個連線的話,可想而知伺服器的壓力有多大。所以併發量大,但是每個使用者又不需頻繁操作的情況下需要短連線。總之:長連線和短連線的選擇要根據需求而定。

· 樂觀鎖和悲觀鎖

  • 樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀,發生衝突的概率低的應用型別,這樣可以提高吞吐量。
  • 悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。悲觀鎖適用於可靠的持續性連線,諸如C/S應用。對於Web應用的HTTP連線,先天不適用。

· 自旋鎖是什麼樣的

  • 對於互斥鎖,如果資源已經被佔用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖。
  • 如果等待的時間比較短,適合使用自旋鎖
  • 佔用大量的CPU資源

· 程序同步的方式

  1. 臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。
  2. 互斥量:為協調共同對一個共享資源的單獨訪問而設計的。
  3. 訊號量:為控制一個具有有限數量使用者資源而設計。
  4. 事 件:用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。

· 執行緒池的結構與如何實現同步

  1. 執行緒池管理器(ThreadPool):用於建立並管理執行緒池,包括 建立執行緒池,銷燬執行緒池,新增新任務;
  2. 工作執行緒(PoolWorker):執行緒池中執行緒,在沒有任務時處於等待狀態,可以迴圈的執行任務;
  3. 任務介面(Task):每個任務必須實現的介面,以供工作執行緒排程任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
  4. 任務佇列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。

· 單例模式多執行緒

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

class Lock

  {

  private:      

      CCriticalSection m_cs;

  public:

      Lock(CCriticalSection  cs) : m_cs(cs)

      {

          m_cs.Lock();

      }

      ~Lock()

      {

          m_cs.Unlock();

      }

  };

  class Singleton

  {

  private:

      Singleton();

      Singleton(const Singleton &);

      Singleton& operator = (const Singleton &);

  public:

      static Singleton *Instantialize();

      static Singleton *pInstance;

      static CCriticalSection cs;

  };

  Singleton* Singleton::pInstance = 0;

  Singleton* Singleton::Instantialize()

  {

      if(pInstance == NULL)

      {   //double check

          Lock lock(cs);           //用lock實現執行緒安全,用資源管理類,實現異常安全

          //使用資源管理類,在丟擲異常的時候,資源管理類物件會被析構,析構總是發生的無論是因為異常丟擲還是語句塊結束。

          if(pInstance == NULL)

          {

              pInstance = new Singleton();

          }

      }

      return pInstance;

  }

1.重複了一面的自我介紹之後,面試官也很直接的在題目上寫了一個二叉樹,然後要求層序遍歷輸出這個二叉樹,要求換行...剛慶幸自己之前看過的時候,發現想不起來了,賊尷尬

其實我只是寫了一個層序遍歷,然後面試官讓講思路的時候,我就一邊講一邊改,最後總算是弄出來了...

3.TCP/UDP的區別,介紹區別順帶說了使用場景,最後補刀TCP頭20位元組,UDP頭8位元組,然後問TCP頭結構(自己坑自己)

4.TCP如何保證可靠性. 把三次握手很詳細地說了一遍,傳送什麼碼進入什麼狀態..

5.除了三次握手還有麼?滑動視窗,1位元等待協議,回退N針協議,選擇性重傳協議說了一邊

6.還有麼?不用說的那麼詳細,時間不太多了 說了 快重傳 快恢復 超時重傳,然後實在不知道了

7.作業系統,程序執行緒的區別,程序間通訊方式

8.網路程式設計,答沒用過,不會

9.select/epoll瞭解不.答瞭解,但不知道對不對,希望不要介意,說了select使用者態到核心態,epoll只負責活躍的,不管那些不活躍的

10.簡單介紹Nginx是如果工作的.答了masterwork之類的,然後沒話可說了趕緊補充一些Apache的prefork時怎麼工作的做了一下對比

2.網路模型以及各層協議,TCP擁塞控制
3.IO複用以及select,poll,epoll區別
4.指標和引用區別
5.資料庫索引有哪些,他們的資料結構
6.複雜度為Onlogn的排序有哪些
7.LRU cache  ,leetcode原題,但是stl規定只能用map,其他全都自己實現。(寫了好久,主要是要自己寫雙向連結串列list不能用STL)