華為OD機試+技術面完整經驗:三道機考題到終面的全記錄

技術面試作者: 美歷團隊

華為OD社招機試+技術面試全流程復盤,含機試三道真題、技術一面二面、HR面真題,數據結構、算法、Java基礎、系統設計等核心考點詳解

背景介紹

本人2年Java開發經驗,本科普通一本,之前在一家外包公司做政務系統。說實話在外包待了兩年心裡挺憋屈的,技術成長有限,項目也沒什麼挑戰性。華為OD是我社招的第一選擇,雖然OD是外包轉正的通道,但華為的技術棧和業務體量在那擺著,比純外包強太多了。

準備時間大概一個月,重點刷了LeetCode中等題大概150道,數據結構方面鏈表、樹、圖都過了一遍。Java基礎方面複習了集合、並發、JVM,還專門練了機試的輸入輸出格式。投遞後3天就收到機試通知,整個流程走下來大概兩週。

第1輪 機試(3道題,150分鐘)

5月12號下午2點,在家用牛客網在線做題。提前15分鐘登錄系統,攝像頭和麥克風都要開。說實話手心全是汗,因為機試不過後面全白搭。華為OD機試滿分600分,3道題分別是100分、200分、300分,一般過150分就能進面試,但想穩一點最好拿到300分以上。

第1題(100分):字符串壓縮

題目大意是給定一個字符串,把連續重複的字符壓縮成「字符+次數」的形式,比如"aabccc"壓縮成"a2bc3"。單個字符不寫次數。這道題不難,用雙指針遍歷就行。我大概8分鐘寫完,測試用例全過。

第2題(200分):滑動窗口最大值

題目給定一個數組和窗口大小k,求每個滑動窗口的最大值。這題就是LeetCode 239的原題,我用單調隊列做的,O(n)時間複雜度。大概15分鐘寫完,測試用例全過。這題我之前刷過,所以寫得比較快。

第3題(300分):最短路徑變種

題目大意是一個網格地圖,有些格子有障礙物,有些格子有加速道具,求從起點到終點的最短時間。加速道具可以讓下一步移動距離翻倍。我用BFS做的,狀態除了坐標還要記錄是否持有加速道具。這題想了大概20分鐘才開始寫,中間還改了一次邏輯,最後測試用例過了8個,有2個超時。估計是狀態去重沒做好。

機試最終得分460分,第3題按通過用例比例給了部分分。第二天就收到技術一面通知。

第2輪 技術一面(視頻面,約60分鐘)

5月15號上午10點,華為WeLink視頻面。面試官是個高級工程師,看起來三十出頭,挺和藹的。先聊了機試的情況,問我第3題的思路,我重新講了BFS的狀態設計,面試官說思路沒問題,可能是狀態空間太大導致超時。

1. 自我介紹

我簡要說了一下工作經歷和技術棧,重點講了政務系統的核心模組。大概說了3分鐘。

2. ArrayList和LinkedList的區別

我從底層數據結構、隨機訪問性能、插入刪除性能、內存佔用幾個維度對比:ArrayList基於數組,隨機訪問O(1),中間插入刪除O(n);LinkedList基於雙向鏈表,隨機訪問O(n),頭尾插入刪除O(1)。面試官追問了什麼場景用LinkedList,我說了頻繁頭尾插入的場景比如Deque的實現。

3. HashMap的擴容機制

我講了當元素數量超過容量乘負載因子時擴容為原來的2倍,JDK 1.8用高低位鏈表避免重新hash,只需要看新增的那一位是0還是1就能確定在新數組的位置。面試官追問了多線程下HashMap有什麼問題,我答了數據丟失和死循環(JDK 1.7的頭插法導致環形鏈表)。

4. 線程池的核心參數

我列了7個:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。重點講了任務提交的流程:先到核心線程→核心線程滿了進隊列→隊列滿了創建非核心線程→都滿了執行拒絕策略。面試官追問了四種拒絕策略,我答了AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。

5. Spring的IOC和AOP

IOC是控制反轉,把對象的創建和管理交給Spring容器,通過DI(依賴注入)實現。AOP是面向切面編程,把橫切關注點(日誌、事務、權限)從業務代碼中抽離。面試官追問了AOP的實現方式,我答了JDK動態代理和CGLIB。

6. MySQL的索引類型

我講了主鍵索引、唯一索引、普通索引、組合索引、全文索引。重點講了組合索引的最左前綴原則和覆蓋索引。面試官追問了聚簇索引和非聚簇索引的區別,我答了聚簇索引葉子節點存完整數據行,非聚簇索引葉子節點存主鍵值需要回表。

7. 算法:合併兩個有序鏈表(LeetCode 21)

用虛擬頭節點+雙指針,10分鐘寫完。面試官讓改成合併K個有序鏈表,我說了用優先隊列,時間複雜度O(nklogk)。沒讓寫代碼,口述思路就行。

8. 項目深挖:你的政務系統用了什麼技術架構

我講了Spring Boot + MyBatis + MySQL + Redis,前端用的是Vue。面試官追問了Redis在項目裡怎麼用的,我答了做字典數據緩存和分佈式鎖。說實話這個項目技術含量不高,面試官也沒太深挖。

一面結束後當天下午就收到二面通知,華為的效率確實高。

第3輪 技術二面(視頻面,約70分鐘)

5月17號下午3點,這輪面試官是部門的技術主管,問題更深入,也更偏實際項目經驗。

1. JVM垃圾回收算法有哪些

我講了標記-清除、標記-複製、標記-整理、分代收集。重點講了新生代用標記-複製(Eden和Survivor區),老年代用標記-整理。面試官追問了CMS和G1的區別,我答了CMS是並發標記清除,有浮動垃圾和空間碎片問題;G1是基於Region的分區收集,可以控制停頓時間。

2. volatile和synchronized的區別

volatile保證可見性和禁止指令重排序,但不保證原子性;synchronized保證原子性、可見性、有序性。volatile是輕量級同步,適用於一個線程寫多個線程讀的場景;synchronized是重量級鎖,適用於複合操作的原子性保證。面試官追問了volatile的實現原理,我答了內存屏障。

3. Redis的數據結構有哪些

我列了5種基本類型:String、List、Hash、Set、ZSet。面試官追問了ZSet的底層實現,我答了壓縮列表和跳表,元素數量超過128或元素長度超過64字節時從壓縮列表轉為跳表。

4. 如何設計一個秒殺系統

我從幾個層面講了:1)前端:按鈕防抖、驗證碼;2)網關:限流;3)服務層:Redis預減庫存、MQ異步下單;4)數據庫:樂觀鎖。面試官追問了Redis和數據庫的數據一致性怎麼保證,我答了先更新數據庫再刪緩存,配合延遲雙刪。

5. 分佈式鎖怎麼實現

我講了三種:1)Redis的SETNX+過期時間;2)Redisson的看門狗自動續期;3)Zookeeper的臨時順序節點。面試官追問了Redis分佈式鎖有什麼問題,我答了主從切換時鎖可能丟失,RedLock算法可以解決但性能有損耗。

6. 算法:二叉樹的最近公共祖先(LeetCode 236)

用遞歸後序遍歷,15分鐘寫完。面試官讓分析時間複雜度,我答了O(n)。這題答得還行。

7. 你在項目中遇到過最有挑戰的問題是什麼

我講了一次線上OOM問題,原因是導出Excel時一次性加載了10萬條數據到內存。排查過程:先看JVM堆內存監控發現老年代持續增長,然後看GC日誌確認Full GC頻繁但回收不了,最後用jmap導出堆轉儲分析發現是Excel數據對象佔了大頭。解決方案:分批查詢+流式寫入Excel。

8. 你有什麼想問我的

我問了OD轉正的考核標準,面試官說主要看項目貢獻和技術能力,一般1-2年可以轉正。

第4輪 HR面(視頻面,約20分鐘)

5月19號上午11點,HR面比較簡短。

1. 為什麼選擇華為OD

我說了華為的技術平台和業務體量是業內頂尖的,OD雖然不是正式員工但能接觸到核心項目,而且有轉正通道,比純外包的成長空間大。

2. 你對加班的看法

我說了項目緊的時候加班可以接受,但希望是階段性的而不是常態化的。

3. 期望薪資

說了期望15K,HR說會在定級後給具體方案。

4. 你還有什麼問題

我問了入職後的培訓安排,HR說有1週的入職培訓和3個月的導師帶教期。

面試真題匯總

1. 字符串壓縮 — 字符串操作 — 簡單

2. 滑動窗口最大值 — 隊列/滑動窗口 — 中等

3. 最短路徑變種 — BFS/圖 — 較難

4. ArrayList與LinkedList區別 — Java基礎 — 簡單

5. HashMap擴容機制 — Java基礎 — 中等

6. 線程池核心參數 — Java並發 — 中等

7. Spring IOC和AOP — Spring — 中等

8. MySQL索引類型 — 數據庫 — 中等

9. 合併兩個有序鏈表 — 鏈表 — 簡單

10. JVM垃圾回收算法 — JVM — 中等

11. volatile與synchronized區別 — Java並發 — 中等

12. Redis數據結構 — 中間件 — 中等

13. 秒殺系統設計 — 系統設計 — 較難

14. 分佈式鎖實現 — 分佈式 — 較難

15. 二叉樹最近公共祖先 — 樹 — 中等

心得體會與建議

1. 機試是門檻,必須認真準備:華為OD機試3道題,第1題一定要全對,第2題盡量全對,第3題能做多少做多少。我第3題雖然沒全過,但前兩題滿分,總分460也夠了。建議刷題重點放在字符串、數組、BFS/DFS、動態規劃這些高頻考點。

2. Java基礎要扎實:華為OD技術面不像阿里那樣追到源碼級別,但基礎一定要扎實。集合、並發、JVM這些是必考,而且會結合項目場景問,不是純背八股。

3. 項目經驗要能講出亮點:我那個政務系統說實話技術含量不高,但我重點講了OOM排查過程和解決方案,面試官覺得這個經驗挺實際的。項目不在於多牛,在於你能從中學到什麼。

4. 算法不能太弱:技術面會手撕代碼,中等題要能寫。合併鏈表、最近公共祖先這些經典題必須會。

最終結果:5月22號收到offer,定級D2,base深圳,月薪14K。從投遞到拿offer共10天。整體體驗不錯,流程很高效。

FAQ

Q:華為OD機試多少分能過?
A:一般150分以上就有面試機會,但建議拿到300分以上比較穩。滿分600,3道題分別100/200/300分。

Q:華為OD面試一般幾輪?
A:通常是3-4輪:機試、技術一面、技術二面、HR面。部分崗位可能有交叉面。

Q:華為OD和技術面主要考什麼?
A:Java基礎、並發、JVM、Spring、MySQL、Redis是必考,算法手撕代碼也是標配。

Q:華為OD能轉正嗎?
A:能,一般1-2年可以轉正,主要看項目貢獻和技術能力。轉正後待遇和正式員工一樣。

Q:華為OD薪資大概多少?
A:D1大概10-13K,D2大概13-16K,D3大概16-20K,具體看城市和定級。

#華為OD#機試#社招#面試經驗