華為OD機試+技術面完整經驗:從刷題到拿offer的全流程復盤
2年Java開發華為OD面試全流程復盤,包含機試三道題、技術一面二面、HR面真題,涵蓋Java基礎、Spring、MySQL、算法等考點,附機試備考建議和面試真題匯總
背景介紹
先說下我的情況,2年Java開發經驗,目前在一家不到50人的小公司做企業級SaaS系統,技術棧是Spring Boot + MyBatis-Plus + MySQL + Redis + RabbitMQ。說實話小公司的日子挺安逸的,但技術成長有限,專案也沒什麼挑戰性,一直想往大平台跳。
今年3月份,一個大學同學在華為OD工作了大半年,跟我說OD雖然不是正式員工,但工作內容、技術棧和華為正式員工基本一樣,而且有機會轉正,門檻比社招低不少。我之前對OD有偏見,覺得就是外包嘛,但了解之後發現OD是華為自己的外包體系,和第三方外包完全不同,辦公環境、技術培訓都是和正式員工一起的。
3月15號我在華為招聘官網上投了履歷,選的是Cloud BU的Java開發崗。投完之後等了一週多才收到機試通知,中間我還以為履歷沒過。後來才知道OD的履歷審核比較慢,需要華為內部員工推薦或者渠道審核通過才能安排機試。
機試之前我刷了大概兩週的題,主要在牛客網上刷華為OD機試題庫,LeetCode也刷了一些。說實話我演算法基礎一般,大學資料結構課也就是飄過,工作之後基本沒寫過演算法題。所以這兩週我每天下班後刷3-4道,週末刷8-10道,從簡單的字串和陣列題開始,慢慢過渡到中等難度的DFS和BFS題。
機試(3道題,150分鐘)
機試是3月28號週六下午2點,用的華為自己的線上考試平台。考試前要裝一個監控軟體,攝影機全程錄影,桌面也不能切換。150分鐘3道題,滿分600分,一般150分以上就能過,但不同部門要求不一樣,Cloud BU據說要200分以上。
我最後拿了350分,第一題100分滿分,第二題200分滿分,第三題只拿了50分(部分用例沒過)。下面詳細說說每道題。
第一題(100分,簡單):字串壓縮
題目描述:給定一個由小寫字母組成的字串,請對其進行壓縮。壓縮規則為:連續重複的字元用「字元+重複次數」表示,如果重複次數為1則省略。例如,"aaabbc"壓縮後為"a3b2c","abc"壓縮後為"abc"。
這道題比較簡單,我用了雙指標的方法,一個指標遍歷字串,另一個指標記錄當前連續字元的起始位置。遇到不同字元時,計算連續長度並拼接結果。大概5分鐘就寫完了,一遍過全部用例。
第二題(200分,中等):會議室調度
題目描述:有N個會議,每個會議有開始時間和結束時間。求至少需要多少個會議室才能安排所有會議,且同一會議室內的會議時間不能重疊。
這道題本質就是經典的最大重疊區間問題。我的思路是:把所有時間點排序,開始時間+1,結束時間-1,然後遍歷排序後的時間點,累加計數器,最大值就是需要的會議室數。寫完之後跑了下測試用例,發現有個邊界情況沒處理——同一時間結束一個會議又開始另一個會議,應該先結束再開始。改了一下排序規則,結束時間排在開始時間前面,就過了。這道大概花了25分鐘。
第三題(300分,較難):城市連通最小代價
題目描述:有N個城市,M條道路,每條道路連接兩個城市且有修建代價。部分道路已經建好(代價為0)。求讓所有城市連通的最小代價。如果無法連通所有城市,返回-1。
這道題我一看就知道是最小生成樹問題,應該用Kruskal演算法+並查集。但問題是我並查集寫得不熟練,路徑壓縮那塊卡了好一會兒。最後寫出來了,但只過了部分用例,我懷疑是並查集合併的時候有bug,但時間不夠了沒來得及除錯。最終這道只拿了50分。
機試完我心裡有點沒底,第三題沒做出來怕過不了。結果4月2號收到通知說機試過了,可以安排面試。後來了解到350分在OD機試裡算中等偏上的成績。
第1輪 技術一面(視訊面,約60分鐘)
一面是4月8號週三上午10點,用的華為WeLink視訊會議。面試官是個30歲左右的男生,自我介紹說是Cloud BU的工程師,工作6年。開場讓我做了自我介紹,然後就開始問技術問題。
1. Java中==和equals的區別
我說了==比較的是引用地址,equals比較的是內容。基本型別用==比較值,引用型別用==比較地址。Object的equals預設和==一樣,String重寫了equals逐字元比較。面試官追問了Integer快取池的範圍,我答了-128到127,超出範圍會new新物件。
2. HashMap和HashTable的區別
我列了幾個:HashMap執行緒不安全,HashTable執行緒安全(方法加synchronized);HashMap允許null鍵和null值,HashTable不允許;HashMap預設容量16,HashTable預設容量11;HashMap用紅黑樹最佳化鏈結串列,HashTable沒有。面試官追問了ConcurrentHashMap怎麼保證執行緒安全,我說了JDK 1.7用Segment分段鎖,1.8用CAS + synchronized鎖頭節點。
3. Spring中@Autowired和@Resource的區別
我說了@Autowired是Spring的註解,按型別注入;@Resource是JDK的註解,按名稱注入。@Autowired配合@Qualifier可以按名稱注入,@Resource的name屬性指定bean名稱。面試官追問了@Autowired注入方式有幾種,我說了欄位注入、建構子注入、Setter注入,推薦建構子注入因為不可變且能檢測循環依賴。
4. Spring Boot的啟動流程
我從main方法講起:建立SpringApplication物件,推斷應用型別(Servlet/Reactive),載入ApplicationContextInitializer和ApplicationListener,執行run方法,建立ApplicationContext,重新整理容器(Bean定義載入、自動配置、Bean建立),執行CommandLineRunner。面試官沒追問,說「了解得還行」。
5. MySQL索引失效的場景有哪些
我列了幾個常見的:1)對索引列使用函數或運算;2)隱式型別轉換,如varchar列用int查詢;3)like以萬用字元開頭;4)OR條件中有一列無索引;5)聯合索引不滿足最左前綴原則;6)IS NULL和IS NOT NULL在某些情況下失效。面試官追問了聯合索引(a,b,c),查b=1能不能走索引,我說不能,因為不滿足最左前綴。
6. Redis的資料型別有哪些,分別用在什麼場景
我說了五種基本型別:String做快取和計數器,Hash存物件,List做訊息佇列和最新列表,Set做去重和交集並集運算,ZSet做排行榜和延時佇列。面試官追問了ZSet底層實現,我說了壓縮列表和跳表,元素少用壓縮列表,多了轉跳表。
7. 你專案裡RabbitMQ怎麼用的,為什麼不用Kafka
我說了我們用RabbitMQ做非同步通知和延遲訊息,選它是因為專案訊息量不大,RabbitMQ管理介面好用,支援多種交換機型別靈活路由。Kafka更適合大資料量日誌場景。面試官追問了RabbitMQ怎麼保證訊息不丟失,我說了生產者確認機制、訊息持久化、消費者手動ACK。
8. 演算法題:反轉鏈結串列(LeetCode 206)
這道題我刷過,用迭代法三指標(prev、curr、next)反轉,5分鐘寫完。面試官讓我再用遞迴寫一遍,也寫出來了。面試官說「基礎題沒問題」。
一面小結
一面整體偏基礎,Java基礎和Spring問得多,MySQL和Redis各一道。演算法題簡單,反轉鏈結串列屬於必刷題。面試官態度挺好的,答不上來的地方會給提示。4月11號收到二面通知,間隔3天。
第2輪 技術二面(視訊面,約65分鐘)
二面是4月15號週三下午3點,面試官級別比一面高,一上來就說「我們直接聊技術吧」,沒有自我介紹環節。
1. JVM垃圾回收演算法有哪些,各有什麼優缺點
我說了標記-清除(簡單但有記憶體碎片)、標記-複製(無碎片但浪費空間,適合新生代)、標記-整理(無碎片但效率低,適合老年代)。面試官追問了G1收集器的特點,我說了G1把堆分成等大Region,維護優先級列表回收收益最大的Region,可預測停頓時間。面試官又追問了G1什麼時候觸發Full GC,我說了並發標記階段發現回收速度跟不上分配速度時會退化成Serial Old做Full GC。
2. volatile關鍵字的作用和原理
我說了兩個作用:保證可見性(修改後立即重新整理到主記憶體)和禁止指令重排。原理是透過記憶體屏障實現的,寫操作前插入StoreStore屏障,寫操作後插入StoreLoad屏障;讀操作前插入LoadLoad屏障,讀操作後插入LoadStore屏障。面試官追問了volatile能不能保證原子性,我說不能,舉了i++的例子,需要用AtomicInteger或synchronized。
3. Synchronized和ReentrantLock的區別
我列了幾個:Synchronized是JVM層面,ReentrantLock是API層面;Synchronized自動釋放鎖,ReentrantLock需要手動unlock;ReentrantLock支援公平鎖、可中斷鎖、多條件變數;Synchronized支援鎖升級(偏向鎖→輕量級鎖→重量級鎖)。面試官追問了什麼場景用ReentrantLock更好,我說需要公平鎖、需要嘗試獲取鎖(tryLock)、需要多個等待佇列時用ReentrantLock。
4. Spring事務傳播機制有哪些
我說了七種:REQUIRED(預設,有事務加入,沒有新建)、REQUIRES_NEW(總是新建,掛起當前事務)、NESTED(巢狀事務)、SUPPORTS(有事務加入,沒有非事務執行)、NOT_SUPPORTED(非事務執行,掛起當前事務)、MANDATORY(必須在事務中,否則拋異常)、NEVER(不能在事務中,否則拋異常)。面試官追問了REQUIRED和REQUIRES_NEW的區別,我說REQUIRES_NEW是獨立事務,外層回滾不影響內層,內層回滾也不影響外層。
5. MySQL慢查詢怎麼最佳化
我說了幾個步驟:1)用EXPLAIN看執行計畫,關注type、key、rows、Extra欄位;2)檢查是否走了索引,沒走就加索引或改寫SQL;3)避免SELECT *,只查需要的列;4)大表考慮分頁最佳化,用遊標分頁代替OFFSET;5)資料量特別大考慮分庫分表。面試官追問了EXPLAIN的type欄位有哪些值,我說了從好到差:system > const > eq_ref > ref > range > index > ALL。
6. 你專案裡遇到過什麼線上問題,怎麼排查的
我說了一個真實案例:有次上線後介面回應變慢,P99從200ms漲到2s。排查過程:1)先看監控發現是資料庫查詢慢;2)查慢查詢日誌發現一條SQL走了全表掃描;3)EXPLAIN發現索引失效,原因是新增的查詢條件做了隱式型別轉換;4)修改SQL參數型別後恢復正常。面試官追問了怎麼預防這類問題,我說了程式碼Review檢查SQL、上線前EXPLAIN驗證、慢查詢告警。
7. 演算法題:二元樹的層序遍歷(LeetCode 102)
用佇列BFS實現,每層記錄節點數然後逐層輸出。這道題我刷過,8分鐘寫完。面試官追問了如果用DFS怎麼做,我說了帶深度參數的遞迴,結果按深度分組。
二面小結
二面明顯比一面深入,JVM和並發問得更細,Spring事務傳播機制我答得有點磕巴,NESTED和REQUIRES_NEW的區別一開始沒說清楚,面試官提醒了一下才理順。線上問題排查那道我答得還行,因為是真實經歷。4月18號收到HR面通知,間隔3天。
第3輪 HR面(約30分鐘)
HR面是4月22號週三上午11點,面試官是Cloud BU的HR,聲音很溫柔,整體氛圍比較輕鬆。
1. 自我介紹
我簡單說了下工作經歷、技術棧和為什麼想來華為OD。
2. 為什麼選擇華為OD而不是其他公司
我說了三個原因:華為的技術平台大,能接觸到企業級雲服務的真實場景;OD有機會轉正,長期發展有保障;身邊有朋友在OD工作體驗不錯,推薦我來。
3. 你了解OD和正式員工的區別嗎
我說了OD是華為的外包體系,和德科簽合約,但工作內容、辦公環境、技術培訓和正式員工一樣。區別主要在薪資結構、股票期權和轉正通道上。
4. 你的薪資期望是多少
我說了期望月薪範圍,HR說會根據機試成績和面試表現定級,大概一週內給結果。
5. 你能接受加班嗎
我說了專案緊的時候加班可以接受,但希望是有效率的加班而不是形式主義。HR笑了笑說華為確實比較忙,但Cloud BU整體節奏還算可控。
6. 你有什麼想問我的
我問了兩個問題:OD轉正的比例大概是多少,HR說每年有考核,表現好的有機會;團隊的技術氛圍怎麼樣,HR說團隊每週有技術分享,鼓勵學習。
面試真題彙總
- ==和equals的區別 — Java基礎 — 簡單
- HashMap和HashTable的區別 — Java基礎 — 中等
- @Autowired和@Resource的區別 — Spring — 簡單
- Spring Boot啟動流程 — Spring — 中等
- MySQL索引失效場景 — MySQL — 中等
- Redis資料型別和應用場景 — Redis — 簡單
- RabbitMQ使用和訊息可靠性 — 中介軟體 — 中等
- 反轉鏈結串列 — 演算法題 — 簡單
- JVM垃圾回收演算法 — JVM — 較難
- volatile關鍵字作用和原理 — Java並發 — 中等
- Synchronized和ReentrantLock區別 — Java並發 — 中等
- Spring事務傳播機制 — Spring — 較難
- MySQL慢查詢最佳化 — MySQL — 中等
- 線上問題排查經驗 — 專案經驗 — 中等
- 二元樹層序遍歷 — 演算法題 — 簡單
- 字串壓縮 — 機試題 — 簡單
- 會議室調度 — 機試題 — 中等
- 城市連通最小代價 — 機試題 — 較難
心得體會與建議
1. 機試是OD面試的第一道門檻,一定要認真準備:華為OD機試150分就能過,但不同部門要求不同,Cloud BU、2012實驗室這些核心部門可能要200分以上。建議刷牛客網OD題庫,重點練字串處理、排序、DFS/BFS、動態規劃這幾類。機試可以用Java、Python、C++,選自己最熟的語言就行。
2. 技術面試重視基礎,不會問太偏的題:華為OD的面試難度比阿里、字節低一個檔次,Java基礎、Spring、MySQL、Redis這些主流技術棧掌握好就行。演算法題也是中等難度,不會出hard。但基礎一定要扎實,比如HashMap的底層實現、Spring事務傳播機制這些,不能只知皮毛。
3. 專案經驗要能講清楚,最好有線上問題排查經歷:面試官很看重你有沒有實際解決問題的能力,純背八股文是不夠的。建議把自己專案中的技術選型、難點、最佳化過程都梳理一遍,特別是線上問題排查,這種真實經歷面試官很感興趣。
4. OD不是終點,是起點:很多人對OD有偏見,覺得是外包低人一等。但OD確實是一個進入華為體系的通道,工作內容和正式員工基本一樣,技術成長也不差。如果你目前在小公司,OD是一個不錯的跳板。
最終結果:4月28號收到offer,定級D2,從投遞到拿offer總共44天。薪資比之前漲了約40%,整體比較滿意。
FAQ
Q:華為OD機試多少分過?
A:一般150分以上就能過,但核心部門(Cloud BU、2012實驗室等)可能要求200分以上。機試滿分600分,3道題分別100分、200分、300分。
Q:華為OD面試有幾輪?
A:一般3輪:機試 + 技術一面 + 技術二面 + HR面。有些部門可能只有一輪技術面,具體看部門安排。
Q:OD轉正難嗎?
A:轉正需要滿足一定條件:工作滿一定時間(通常1-2年)、績效達標、通過轉正答辯。轉正比例因部門而異,整體來說表現優秀是有機會的。
Q:OD和正式員工待遇差多少?
A:OD和正式員工的基本工資差距不大,主要區別在股票期權、年終獎和福利上。OD沒有股票,年終獎一般1-2個月,正式員工可能3-6個月。
Q:華為OD面試經驗有什麼用?
A:華為OD面試經驗對後續跳槽很有幫助,因為面試內容和大廠社招高度重合。Java基礎、Spring、MySQL、Redis、演算法這些,面哪個公司都繞不開。而且OD的工作經歷在履歷上也有一定含金量。

