华为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#机试#社招#面试经验