作者:守望者1028
鏈接:https://www.nowcoder.com/discuss/55353
來源:牛客網
面試高頻題:
校招過程中參考過牛客諸位大佬的面經,但是具體哪一塊是參考誰的我也忘記了,如果您看到有些熟悉,那么可能就是您的,如果您覺得侵權,請告訴我,我撤回。
1語言基礎(C++)
(1) 指針和引用的區別
(2) 堆和棧的區別
(3) new和delete是如何實現的,new 與 malloc的異同處
(4) C和C++的區別
(5) C++、Java的聯系與區別,包括語言特性、垃圾回收、應用場景等(java的垃圾回收機制)
(6) Struct和class的區別
(7) define 和const的區別(編譯階段、安全性、內存占用等)
(8) 在C++中const和static的用法(定義,用途)
(9) const和static在類中使用的注意事項(定義、初始化和使用)
(10) C++中的const類成員函數(用法和意義)
(11) 計算下面幾個類的大小:
class A {};: sizeof(A) = 1;
class A { virtual Fun(){} };: sizeof(A) = 4(32位機器)/8(64位機器);
class A { static int a; };: sizeof(A) = 1;
class A { int a; };: sizeof(A) = 4;
class A { static int a; int b; };: sizeof(A) = 4;
(12) 給一個代碼,求輸出結果
class A
{
public:
A(int x){}
}
問:A a = 1;是否正確, 如果正確, 那么它調用了哪些函數?
這類題目更常見的是在基類和子類有不同實現方法。(虛函數相關,栗子很多,不多說了)
(13) C++的STL介紹(這個系列也很重要,建議侯捷老師的這方面的書籍與視頻),其中包括內存管理allocator,函數,實現機理,多線程實現等
(14) STL源碼中的hash表的實現
(15) STL中unordered_map和map的區別
(16) STL中vector的實現
(17) vector使用的注意點及其原因,頻繁對vector調用push_back()對性能的影響和原因。
(18) C++中的重載和重寫的區別:
(19) C ++內存管理(熱門問題)
(20) 介紹面向對象的三大特性,並且舉例說明每一個。
(21) 多態的實現(和下個問題一起回答)
(22) C++虛函數相關(虛函數表,虛函數指針),虛函數的實現原理(熱門,重要)
(23) 實現編譯器處理虛函數表應該如何處理
(24) 析構函數一般寫成虛函數的原因
(25) 構造函數為什么一般不定義為虛函數
(26) 構造函數或者析構函數中調用虛函數會怎樣
(27) 純虛函數
(28) 靜態綁定和動態綁定的介紹
(29) 引用是否能實現動態綁定,為什么引用可以實現
(30) 深拷貝和淺拷貝的區別(舉例說明深拷貝的安全性)
(31) 對象復用的了解,零拷貝的了解
(32) 介紹C++所有的構造函數
(33) 什么情況下會調用拷貝構造函數(三種情況)
(34) 結構體內存對齊方式和為什么要進行內存對齊?
(35) 內存泄露的定義,如何檢測與避免?
(36) 手寫實現智能指針類(34-37我沒遇見過)
(37) 調試程序的方法
(38) 遇到coredump要怎么調試
(39) 內存檢查工具的了解
(40) 模板的用法與適用場景
(41) 成員初始化列表的概念,為什么用成員初始化列表會快一些(性能優勢)?
(42) 用過C11嗎,知道C11新特性嗎?(有面試官建議熟悉C11)
(43) C++的調用慣例(簡單一點C++函數調用的壓棧過程)
(44) C++的四種強制轉換
2計算機網絡(TCP/IP)
(1) 建立TCP服務器的各個系統調用
(2) 繼上一題,說明socket網絡編程有哪些系統調用?其中close是一次就能直接關閉的嗎,半關閉狀態是怎么產生的?
(3) 對路由協議的了解與介紹。內部網關協議IGP包括RIP,OSPF,和外部網關協議EGP和BGP.
(4) 路由協議所使用的算法。
(5) TCP和UDP的區別
(6) TCP和UDP相關的協議與端口號
(7) TCP(UDP,IP)等首部的認識(http請求報文構成)
(8) 網頁解析的過程與實現方法
(9) 在瀏覽器中輸入URL后執行的全部過程(如www.baidu.com)
(10) 網絡層分片的原因與具體實現
(11) TCP的三次握手與四次揮手的詳細介紹(TCP連接建立與斷開是熱門問題)
(12) TCP握手以及每一次握手客戶端和服務器端處於哪個狀態(11種狀態)
(13) 為什么使用三次握手,兩次握手可不可以?
(14) TIME_WAIT的意義(為什么要等於2MSL)
(15) 超時重傳機制(不太高頻)
(16) TCP怎么保證可靠性(面向字節流,超時重傳,應答機制,滑動窗口,擁塞控制,校驗等)?
(17) 流量控制的介紹,采用滑動窗口會有什么問題(死鎖可能,糊塗窗口綜合征)?
(18) tcp滑動窗口協議
(19) 擁塞控制和流量控制的區別
(20) TCP擁塞控制,算法名字?(極其重要)
(21) http協議與TCP聯系
(22) http/1.0和http/1.1的區別
(23) http的請求方法有哪些?get和post的區別。
(24) http的狀態碼
(25) http和https的區別,由http升級為https需要做哪些操作
(26) https的具體實現,怎么確保安全性
(27) http中瀏覽器一個URL的流程,這個過程中瀏覽器做了什么,URL包括哪三個部分?
(28) 一個機器能夠使用的端口號上限是多少,為什么?可以改變嗎?那如果想要用的端口超過這個限制怎么辦?
(29) 對稱密碼和非對稱密碼體系
(30) 數字證書的了解(高頻)
(31) 客戶端為什么信任第三方證書
(32) RSA加密算法,MD5原理(MD5不算加密算法)
(33) 單條記錄高並發訪問的優化
(34) 介紹一下ping的過程,分別用到了哪些協議
(35) TCP/IP的分片粘包過程
(36) 有沒有抓過TCP包,描述一下
(37) 一個ip配置多個域名,靠什么識別?
(38) 服務器攻擊(DDos攻擊)
3數據庫(MySQL)
數據庫我自身不是特別熟,面試的時候一般也都坦言了,所以面試官都只是問一些基礎題目。
(1) 關系型和非關系型數據庫的區別(各自優點)
(2) 常用SQL語句(DDL,DML,DCL,TCL)
(3) 數據庫中join的類型與區別(inner join, outer join, cross join, natural join, self join),注意適用場景和sql語句的編寫
(4) 數據庫的索引類型
(5) 聚集索引和非聚集索引的區別(葉節點存儲內容)
(6) 唯一性索引和主碼索引的區別
(7) 索引的優缺點,什么時候使用索引,什么時候不能使用索引(重點)
(8) 索引的底層實現(B+樹,為何不采用紅黑樹,B樹)
(9) B樹和B+樹具體實現
(10) 索引最左前綴問題
(11) Mysql的優化(高頻,索引優化,性能優化)
(12) 數據庫引擎介紹,innodb和myisam的特點與區別
(13) 數據庫中事務的ACID(四大特性都要能夠舉例說明,理解透徹,比如原子性和一致性的關聯,隔離性不好會出現的問題)
(14) 數據庫隔離性設置不同會出現的問題(臟讀、不可重復讀、丟失修改、幻讀)
(15) 數據庫的隔離級別,mysql和Oracle的隔離級別分別是什么
(16) 數據庫連接池的作用
(17) Mysql的表空間方式,各自特點
(18) 分布式事務
(19) 數據庫的范式
(20) 數據的鎖的種類,加鎖的方式
(21) 視圖的作用與使用方法(如何刪除等)
(22) 分庫分表,主從復制,讀寫分離。(我不會,也沒碰到過)
(23) 項目中哪里用到了數據庫,怎么用的
4Linux基礎
Linux這一塊如果不太熟,可以直接說,但是因為開發崗位一般都是在Linux平台下的,所以幾個基礎問題還是要會的。
(1) Linux的I/O模型介紹以及同步異步阻塞非阻塞的區別(超級重要)
(2) 文件系統的理解(EXT4,XFS,BTRFS)
(3) 文件處理grep,awk,sed這三個命令必知必會
(4) IO復用的三種方法(select,poll,epoll)深入理解,包括三者區別,內部原理實現?
(5) Epoll的ET模式和LT模式(ET的非阻塞)
(6) 查詢進程占用CPU的命令(注意要了解到used,buf,cache代表意義)
(7) linux的其他常見命令(kill,find,cp等等)
(8) shell腳本用法
(9) 硬連接和軟連接的區別
(10) 文件權限怎么看(rwx)
(11) 文件的三種時間(mtime, atime,ctime),分別在什么時候會改變
(12) Linux監控網絡帶寬的命令,查看特定進程的占用網絡資源情況命令
5操作系統
(1) 進程與線程的區別和聯系
(2) 一個進程可以創建多少線程,和什么有關
(3) 一個程序從開始運行到結束的完整過程(四個過程)
(4) 進程通信方法(Linux和windows下),線程通信方法(Linux和windows下)
(5) 進程調度方法詳細介紹
(6) 頁面置換方法詳細介紹
(7) 能否實現一個LRU算法
(8) 死鎖的必要條件(怎么檢測死鎖,解決死鎖問題)
(9) 哲學家就餐,銀行家,讀者寫者,生產者消費者(怎么加鎖解鎖,偽代碼)
(10) 海量數據的bitmap使用原理
(11) 布隆過濾器原理與優點
(12) 布隆過濾器處理大規模問題時的持久化,包括內存大小受限、磁盤換入換出問題
(13) 同步IO和異步IO
(14) 文件讀寫使用的系統調用
(15) 線程池的了解、優點、調度處理方式和保護任務隊列的方式
(16) 怎么回收線程
(17) 僵屍進程問題
(18) 多線程同步(尤其是如果項目中用到了多線程,很大可能會結合討論)
(19) memcache了解
(20) 異常和中斷的區別
(21) 一般情況下在Linux/windows平台下棧空間的大小
6設計模式和算法
設計模式一般都不會考太多,除非你明確說自己懂。我基本上就不涉及到設計模式的東西,所以只是簡要說說。當然,單例模式和簡單工廠模式的概念和使用場景還是要知道的。
(1) 介紹熟悉的設計模式(單例,簡單工廠模式)
(2) 寫單例模式(餓漢模式和懶漢模式),線程安全版本
(3) MVC設計模式
算法這一塊太過龐大,幾乎都有可能,牛油們最好還是去刷劍指offer(level 1),leetcode(如果能夠刷到最高難度,算法對你來說已經不是什么了,或者說面試對你來說簡直就是吃飯喝水的難度),左神的書《程序源代碼面試指南》(字符串,數組,dp,海量數據問題,搞定它們也就搞定面試的一半)。
下面還是簡單的列舉一些吧(包括一些數據結構題目,只列舉簡單的,面試的算法一半不會太難,但是現在一般都是需要比較好的思維,或者曾經接觸過這方面的題,建議就是多刷題,做題感覺是刷出來的)
(1) 紅黑樹的了解(平衡樹,二叉搜索樹),使用場景
(2) 紅黑樹在STL上的應用
(3) 了解並查集嗎?(低頻)
(4) 貪心算法和動態規划的區別
(5) 判斷一個鏈表是否有環,如何找到這個環的起點
(6) 實現一個strcpy函數(或者memcpy),如果內存可能重疊呢
(7) 實現一個循環隊列
(8) 排序算法(寫快排,歸並排序,堆排序),算法的時間復雜度,空間復雜度,是否穩定等
(9) 快排存在的問題,如何優化
(10) 反轉一個鏈表
(11) Top K問題(可以采取的方法有哪些,各自優點?)
(12) Bitmap的使用,存儲和插入方法
(13) 二叉樹的先序、中序、后序遍歷(非遞歸實現)
(14) 二叉樹的公共祖先(簡單地說,劍指offer上的題大都是高頻題)
(15) 1-n中有多少個1
(16) 字典樹的理解以及在統計上的應用
(17) 數組的全排列
(18) N個骰子出現和為m的概率
(19) 海量數據問題(可參考左神的書)
(20) 一致性哈希
7智力題
我特別把智力題單獨拿出來講,是因為這一塊其實有些公司很看重(例如騰訊),但是我基本上也沒刷過這類題目,接觸不多,牛油們自行補充吧。
(1) 100層樓,只有2個雞蛋,想要判斷出那一層剛好讓雞蛋碎掉,給出策略(滴滴筆試中兩個鐵球跟這個是一類題)
(2) 毒葯問題,n拼毒葯,要快速找出哪一瓶有毒,需要幾只小白鼠
(3) 博弈論問題
(4) 先手必勝策略問題:n本書,每次能夠拿X-X本,怎么拿必勝
(5) 放n只螞蟻在一條樹枝上,螞蟻與螞蟻之間碰到就各自往反方向走,問總距離或者時間。
(6) 瓶子換飲料問題:多少個瓶子能夠換1瓶飲料,問最多能喝幾瓶