华为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说团队每周有技术分享,鼓励学习。

面试真题汇总

  1. ==和equals的区别 — Java基础 — 简单
  2. HashMap和HashTable的区别 — Java基础 — 中等
  3. @Autowired和@Resource的区别 — Spring — 简单
  4. Spring Boot启动流程 — Spring — 中等
  5. MySQL索引失效场景 — MySQL — 中等
  6. Redis数据类型和应用场景 — Redis — 简单
  7. RabbitMQ使用和消息可靠性 — 中间件 — 中等
  8. 反转链表 — 算法题 — 简单
  9. JVM垃圾回收算法 — JVM — 较难
  10. volatile关键字作用和原理 — Java并发 — 中等
  11. Synchronized和ReentrantLock区别 — Java并发 — 中等
  12. Spring事务传播机制 — Spring — 较难
  13. MySQL慢查询优化 — MySQL — 中等
  14. 线上问题排查经验 — 项目经验 — 中等
  15. 二叉树层序遍历 — 算法题 — 简单
  16. 字符串压缩 — 机试题 — 简单
  17. 会议室调度 — 机试题 — 中等
  18. 城市连通最小代价 — 机试题 — 较难

心得体会与建议

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的工作经历在简历上也有一定含金量。

相关模板

#华为OD#Java面试#机试#算法#面试真题