以下是計算機專業求職面試的常見題目分類整理,每個大類精選20道高頻問題,結合參考內容進行解析與擴展,幫助系統化備考:
一、數據結構與算法
- 解釋時間復雜度和空間復雜度
- 時間復雜度衡量算法執行時間隨輸入規模的增長趨勢(如O(n));空間復雜度衡量算法所需額外內存(如O(1))。需結合具體算法舉例說明。
- 深度優先搜索(DFS)與廣度優先搜索(BFS)的區別
- DFS通過遞歸或棧實現,適合路徑搜索、拓撲排序;BFS通過隊列實現,適合最短路徑問題。
- 棧與隊列的特點及應用場景
- 棧(LIFO):函數調用、括號匹配;隊列(FIFO):任務調度、緩沖區管理。
- 二分查找的實現與時間復雜度
- 遞歸與非遞歸實現,時間復雜度O(logn),需數組有序。
- 快速排序與歸并排序的核心思想
- 快排:分治+基準值劃分;歸并:分治+合并有序子數組。
- 二叉樹遍歷的三種方式(前序、中序、后序)
- 前序:根→左→右;中序:左→根→右;后序:左→右→根。
- 哈希表的沖突解決方法
- 開放尋址法、鏈地址法、再哈希法。
- 動態規劃的核心思想
- 將問題分解為子問題,通過記憶化存儲中間結果(如背包問題)。
- 紅黑樹與AVL樹的區別
- 紅黑樹通過顏色標記保持近似平衡,插入/刪除效率更高;AVL樹嚴格平衡,查詢更快。
- LRU緩存實現原理
- 使用哈希表+雙向鏈表,保證O(1)的插入和刪除。
- 堆的結構與堆排序步驟
- 完全二叉樹,最大堆/最小堆;堆排序步驟:建堆→交換堆頂元素→調整堆。
- 圖的表示方法(鄰接矩陣 vs 鄰接表)
- 鄰接矩陣適合稠密圖,空間O(n2);鄰接表適合稀疏圖,空間O(n+e)。
- KMP算法原理
- 通過部分匹配表跳過無效字符匹配,時間復雜度O(n+m)。
- 貪心算法的適用場景
- 局部最優解能推導全局最優的問題(如霍夫曼編碼)。
- 反轉鏈表的實現
- 迭代法(三指針)或遞歸法。
- Top K問題的解決方案
- 堆排序(O(nlogk))或快速選擇算法(O(n))。
- 并查集的實現與應用
- 路徑壓縮+按秩合并,用于連通性檢測。
- 布隆過濾器的原理與優缺點
- 位數組+多個哈希函數,空間效率高但存在誤判率。
- 判斷鏈表是否有環
- 快慢指針法(Floyd判圈算法)。
- 最小生成樹算法(Prim vs Kruskal)
- Prim基于頂點擴展,適合稠密圖;Kruskal基于邊排序,適合稀疏圖。
二、操作系統
- 進程與線程的區別
- 進程是資源分配單位,線程是CPU調度單位;線程共享進程內存,切換開銷更小。
- 死鎖的四個必要條件
- 互斥、請求與保持、不可剝奪、循環等待。
- 虛擬內存的作用與實現
- 通過分頁/分段機制擴展內存空間,支持頁面置換算法(LRU、FIFO)。
- 用戶態與內核態切換的觸發條件
- 系統調用、中斷、異常。
- 進程間通信方式
- 管道、消息隊列、共享內存、信號量、Socket。
- 線程同步機制
- 互斥鎖、條件變量、信號量、讀寫鎖。
- 頁面置換算法比較
- 最優置換(理論)、LRU(最近最少使用)、FIFO(可能Belady異常)。
- 孤兒進程與僵尸進程
- 孤兒進程由init進程接管;僵尸進程需父進程調用wait()回收。
- CPU調度算法(FCFS、SJF、RR)
- 先來先服務、短作業優先、時間片輪轉。
- 文件系統結構(inode vs FAT)
- inode存儲文件元數據;FAT通過鏈表管理文件塊。
- DMA的作用
- 允許外設直接訪問內存,減少CPU中斷開銷。
- 中斷處理流程
- 保存現場→執行中斷服務程序→恢復現場。
- 多級反饋隊列調度原理
- 動態調整進程優先級,兼顧響應時間和吞吐量。
- 同步與異步IO的區別
- 同步IO阻塞進程,異步IO通過回調通知。
- 內存碎片問題
- 內部碎片(分配單元未用完)、外部碎片(空閑內存不連續)。
- 軟鏈接與硬鏈接的區別
- 硬鏈接指向inode,刪除原文件不影響;軟鏈接是路徑指針。
- 緩沖區溢出攻擊原理
- 輸入數據超出緩沖區大小,覆蓋返回地址執行惡意代碼。
- 自旋鎖與互斥鎖適用場景
- 自旋鎖(短等待,CPU忙等);互斥鎖(長等待,線程休眠)。
- 系統調用執行流程
- 用戶態→軟中斷→內核態執行→返回結果。
- 零拷貝技術原理
- 減少數據在內核與用戶空間的拷貝次數(如mmap、sendfile)。
三、計算機網絡
- HTTP狀態碼(200、301、404、500)
- 200成功;301永久重定向;404資源未找到;500服務器內部錯誤。
- TCP三次握手與四次揮手
- 握手:SYN→SYN-ACK→ACK;揮手:FIN→ACK→FIN→ACK。
- HTTP與HTTPS的區別
- HTTPS=HTTP+SSL/TLS,加密傳輸,端口443,需CA證書。
- DNS解析過程
- 瀏覽器緩存→系統緩存→路由器→ISP→遞歸查詢根域→權威DNS。
- TCP粘包與拆包問題
- 固定長度、分隔符、長度字段標識消息邊界。
- Cookie與Session的區別
- Cookie存儲在客戶端,Session存儲在服務端,依賴Session ID。
- 對稱加密與非對稱加密的應用場景
- 對稱加密(AES)用于數據傳輸;非對稱加密(RSA)用于密鑰交換。
- GET與POST的區別
- GET參數在URL,有長度限制;POST在請求體,支持大數據。
- ARP協議的作用
- 將IP地址解析為MAC地址,通過廣播請求單播響應。
- CDN工作原理
- 分布式節點緩存內容,就近返回資源,減少延遲。
- WebSocket協議特點
- 全雙工通信,基于HTTP升級,適合實時應用(如聊天室)。
- TCP擁塞控制算法
- 慢啟動、擁塞避免、快速重傳、快速恢復。
- OSI七層模型與TCP/IP四層模型對比
- 應用層(HTTP)→傳輸層(TCP)→網絡層(IP)→鏈路層(MAC)。
- HTTPS握手流程
- 客戶端Hello→服務器證書→密鑰交換→加密通信。
- MTU與MSS的區別
- MTU是鏈路層最大傳輸單元;MSS是TCP層有效數據長度。
- NAT類型與穿透方法
- 完全錐形、受限錐形、端口受限錐形;STUN/TURN/ICE協議。
- QUIC協議的優勢
- 基于UDP,0-RTT連接,多路復用,前向糾錯。
- TIME_WAIT狀態的作用
- 確保最后一個ACK到達,防止舊連接數據干擾新連接。
- HTTP長連接與短連接
- 長連接復用TCP連接(HTTP/1.1默認);短連接每次請求新建連接。
- IP分片與重組
- 數據包超過MTU時分片,目標主機根據標識、偏移量重組。
四、數據庫
- ACID特性
- 原子性(事務全成功/失敗)、一致性(約束保持)、隔離性(并發控制)、持久性(提交后永久保存)。
- 事務隔離級別
- 讀未提交→讀已提交→可重復讀→串行化(解決臟讀、不可重復讀、幻讀)。
- 索引類型(B+樹 vs 哈希)
- B+樹支持范圍查詢;哈希適合等值查詢,無排序。
- SQL優化方法
- 避免SELECT *、使用索引、減少子查詢、分頁優化(limit offset)。
- 數據庫鎖機制(行鎖、表鎖、間隙鎖)
- 行鎖粒度小但開銷大;間隙鎖防止幻讀。
- 范式化與反范式化設計
- 范式化減少冗余,反范式化提升查詢性能。
- MVCC實現原理
- 多版本并發控制,通過版本鏈和ReadView實現無鎖讀。
- 主從復制原理
- 主庫寫binlog,從庫IO線程拉取,SQL線程重放。
- CAP理論
- 一致性(Consistency)、可用性(Availability)、分區容錯性(Partition Tolerance)三者不可兼得。
- Redis持久化方式(RDB vs AOF)
- RDB快照恢復快但可能丟數據;AOF日志更安全但文件大。
- 數據庫分庫分表策略
- 垂直拆分(按業務)、水平拆分(按哈希或范圍)。
- 慢查詢分析與優化
- 開啟慢查詢日志,使用EXPLAIN分析執行計劃。
- 聯合索引的最左匹配原則
- 索引(a,b,c)可匹配a、a,b、a,b,c查詢,但無法跳過a。
- InnoDB與MyISAM的區別
- InnoDB支持事務、行鎖、外鍵;MyISAM表鎖、全文索引。
- 悲觀鎖與樂觀鎖實現
- 悲觀鎖(SELECT FOR UPDATE);樂觀鎖(版本號或CAS)。
- 數據庫連接池的作用
- 復用連接,減少創建/銷毀開銷,提升性能。
- SQL注入防御方法
- 預編譯語句(PreparedStatement)、輸入過濾、最小權限原則。
- 數據庫備份策略
- 全量備份+增量備份,定期恢復測試。
- 分布式事務解決方案
- 2PC(兩階段提交)、TCC(補償事務)、基于消息隊列。
- MongoDB與關系型數據庫對比
- 文檔存儲靈活,適合非結構化數據;關系型數據庫強一致性。
五、編程語言(C++/Java)
- C++虛函數與多態原理
- 虛函數表(vtable)實現動態綁定,基類指針調用派生類方法。
- 智能指針類型(unique_ptr、shared_ptr、weak_ptr)
- unique_ptr獨占所有權;shared_ptr引用計數;weak_ptr解決循環引用。
- Java垃圾回收算法(標記-清除、復制、分代)
- 新生代(復制算法),老年代(標記-整理)。
- C++內存管理(new/delete vs malloc/free)
- new調用構造函數,malloc僅分配內存。
- Java HashMap實現原理
- 數組+鏈表/紅黑樹,負載因子觸發擴容。
- C++ STL容器對比(vector、list、map)
- vector連續內存隨機訪問快;list雙向鏈表插入快;map紅黑樹有序。
- Java線程池參數與工作流程
- corePoolSize、maximumPoolSize、隊列類型、拒絕策略。
- C++ lambda表達式捕獲方式
- 值捕獲([=])、引用捕獲([&])、混合捕獲([a,&b])。
- Java synchronized與ReentrantLock區別
- synchronized關鍵字基于JVM;ReentrantLock提供公平鎖、條件變量。
- C++模板元編程應用場景
- 編譯期計算、類型推導(如STL算法)。
- Java泛型擦除機制
- 編譯后類型擦除為Object,通過橋方法保持多態。
- C++移動語義與右值引用
- 避免深拷貝,轉移資源所有權(std::move)。
- Java反射機制優缺點
- 動態加載類,破壞封裝性,性能較低。
- C++內存對齊原則
- 結構體成員按最大類型大小對齊,減少CPU訪問次數。
- Java JVM內存模型(堆、棧、方法區)
- 堆存儲對象實例;棧存儲局部變量;方法區存儲類信息。
- C++設計模式(單例、工廠、觀察者)
- 單例模式(懶漢式、餓漢式);工廠模式解耦對象創建。
- Java并發工具類(CountDownLatch、CyclicBarrier)
- CountDownLatch一次性等待;CyclicBarrier可重復使用。
- C++異常處理機制(try/catch/throw)
- 棧展開(stack unwinding),資源通過RAII管理。
- Java注解原理與自定義注解
- 元注解(@Target、@Retention),APT處理注解。
- C++11新特性(auto、范圍for、智能指針)
- 類型推導、lambda表達式、右值引用。