华为OD机试+技术面完整经验:从零开始到成功入职
2年经验非科班转码华为OD完整面试经验,含OD机试3道算法题详解、技术一面二面真题、性格测试注意事项,华为OD面试经验2026最新分享。
背景介绍
先说下我的情况吧,我是非科班出身,大学学的是机械工程,毕业后自学了半年Java,然后在一家小公司做了2年开发。公司规模不大,技术栈也比较老,主要就是Spring Boot + MySQL那一套。说实话,在小公司待久了,心里一直有点慌,觉得技术成长太慢,而且薪资也上不去。
今年年初,一个之前在华为OD工作的朋友跟我说,OD的门槛其实没有想象中那么高,而且现在OD转正的机会也多了不少。他建议我试试,还帮我内推了。说实话,一开始我是有点犹豫的,毕竟OD在网上的评价褒贬不一,但想想自己现在的处境,还是决定搏一把。
我大概花了2个月时间准备,主要就是刷算法题和复习Java基础。下面就把整个面试过程详细分享出来,希望对和我一样非科班想进大厂的朋友有所帮助。
完整面试流程复盘
第一步:机试(3道算法题,100+100+200分制)
华为OD的机试是在牛客网上进行的,时长2小时,一共3道题,分值分别是100分、100分、200分。总分400分,一般150分以上就有面试机会,但不同部门要求不一样,我听说有的部门要求200分以上。
第一题(100分):字符串处理
题目大意是给一个字符串,要求把里面连续重复的字符压缩成"字符+次数"的形式,比如"aabbbcc"变成"a2b3c2",如果只出现1次就不写数字。这道题难度不大,我用双指针遍历一遍就搞定了,大概10分钟写完。要注意边界情况,比如空字符串和只有一个字符的情况。
第二题(100分):滑动窗口
题目是给一个整数数组和目标值target,找最长的连续子数组,使得子数组中最大值和最小值的差不超过target。这道题一看就是滑动窗口,我用了两个单调队列分别维护窗口内的最大值和最小值,时间复杂度O(n)。写完之后测试用例全过了,但花了大概30分钟,因为一开始单调队列的出队条件写错了,调试了一会儿。
第三题(200分):图论BFS
题目大意是在一个网格地图上,有障碍物和传送门,求从起点到终点的最短路径。传送门可以瞬间移动到另一个传送门的位置。这道题的关键就是BFS的时候,遇到传送门要特殊处理——到达传送门时,除了正常走四个方向,还要把传送门对应的目标位置也加入队列。我大概花了40分钟写完,中间踩了一个坑:忘记处理传送门双向的问题,导致部分用例超时,后来加了个visited数组去重就好了。
最终机试成绩350分,第一题100分,第二题100分,第三题150分(部分用例没过)。说实话第三题没拿满分有点遗憾,但350分已经够用了。
第二步:技术一面(约1小时)
机试通过后大概1周,HR就联系我安排了一面。面试官是个看起来30岁左右的男生,态度还不错,一开始让我自我介绍,然后就开始问问题了。
Java基础部分:
面试官先问了Java的基本数据类型有哪些,然后问了自动装箱拆箱的原理,还有Integer缓存池的范围(-128到127)。这块我答得还行,但Integer缓存池的具体范围一开始说错了,面试官提示了一下我才想起来。
集合框架部分:
问了HashMap的底层实现,我讲了JDK1.8的数组+链表+红黑树结构,还有扩容机制、负载因子为什么是0.75。面试官追问了HashMap和ConcurrentHashMap的区别,我讲了分段锁到CAS+synchronized的演进。
多线程部分:
问了线程池的核心参数有哪些,我讲了corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory、rejectedExecutionHandler。然后问了线程池的工作流程——先核心线程,再队列,再非核心线程,最后拒绝策略。面试官还问了synchronized和ReentrantLock的区别,我讲了可重入、公平锁、响应中断这些点。
手写代码部分:
面试官让我手写一个单例模式,我写了DCL(双重检查锁定)版本,还特意讲了volatile的作用。然后又出了一道算法题——二叉树的层序遍历,这个我用BFS配合队列写的,不难,大概5分钟搞定。
第三步:技术二面(约1小时)
一面过了3天就安排了二面,二面的面试官级别更高一些,问的问题也更深入。
项目深挖:
面试官让我详细讲了最近做的一个项目,我讲了一个订单系统的重构经历。他追问了很多细节:为什么选择这个技术方案?有没有考虑过其他方案?遇到了什么问题?怎么解决的?这块我准备得比较充分,因为确实是自己做过的项目,所以答得比较流畅。但面试官问到了一个我没想到的问题:如果订单量再增长10倍,你的系统还能撑住吗?我老实说了现有架构的瓶颈,然后讲了一下可能的优化方向。
Spring Boot部分:
问了Spring Boot的自动装配原理,我讲了@EnableAutoConfiguration注解和spring.factories文件,还有条件注解@ConditionalOnClass这些。面试官又问了Spring Boot的启动流程,这个我答得不够好,只说了大概的流程,细节没讲清楚。
MySQL部分:
重点问了索引,包括B+树索引的结构、聚簇索引和非聚簇索引的区别、覆盖索引、最左前缀匹配原则。还问了一个场景题:如果一个查询很慢,你怎么排查?我讲了用EXPLAIN看执行计划,然后分析是否走了索引、扫描了多少行这些。
Redis部分:
问了Redis的常用数据结构,以及各自的应用场景。我讲了String做缓存、Hash存对象、Set做标签、ZSet做排行榜、List做消息队列。面试官追问了Redis的持久化方式RDB和AOF的区别,以及Redis的过期删除策略和内存淘汰策略。
第四步:性格测试
技术面通过后,会收到一个性格测试的链接。这个测试大概200多道题,主要是判断你的性格是否适合在华为工作。网上很多人说性格测试会挂人,所以还是要认真对待的。
我的经验是:一定要前后一致。因为测试里有很多重复的题目,只是换了一种问法,如果你前后回答矛盾,系统会判定你不诚实。尽量选择积极正面的选项,比如遇到困难选择"想办法解决"而不是"寻求帮助",团队合作选择"主动承担"而不是"听从安排"。另外,不要选太极端的选项,保持中庸偏积极就好。
结果
机试后1周安排一面,一面后3天安排二面,二面后4天就收到了offer。整个流程大概2周多,速度还是挺快的。最终薪资比我在小公司涨了差不多40%,虽然OD的身份和正式员工还是有差距,但对我来说已经是一个很大的提升了。
面试真题汇总
机试真题:
1. 字符串压缩:连续重复字符压缩为"字符+次数"形式
2. 滑动窗口:最长连续子数组,最大值与最小值差不超过target
3. 图论BFS:网格地图含障碍物和传送门,求最短路径
技术一面真题:
1. Java基本数据类型与自动装箱拆箱
2. Integer缓存池范围
3. HashMap底层实现与扩容机制
4. HashMap与ConcurrentHashMap区别
5. 线程池核心参数与工作流程
6. synchronized与ReentrantLock区别
7. 手写DCL单例模式
8. 算法题:二叉树层序遍历
技术二面真题:
1. 项目深挖:技术方案选型与系统扩展性
2. Spring Boot自动装配原理
3. MySQL B+树索引结构
4. 聚簇索引与非聚簇索引区别
5. 覆盖索引与最左前缀匹配
6. 慢查询排查方法
7. Redis数据结构与应用场景
8. Redis持久化方式RDB与AOF
心得体会与建议
1. 机试是敲门砖,一定要认真准备。OD机试的难度不算特别高,但也不能掉以轻心。建议至少刷50道LeetCode中等题,重点练字符串、数组、滑动窗口、BFS/DFS这些高频题型。机试分数越高,后续选择部门的余地越大。
2. Java基础要扎实。一面主要考基础,HashMap、线程池、并发这些几乎是必考的。不要只会背八股文,要真正理解原理,因为面试官会追问细节。
3. 项目经验要能讲清楚。二面会深挖项目,一定要提前梳理自己做过的项目,想清楚每个技术决策背后的原因。面试官最看重的不是你用了什么技术,而是你为什么选择这个技术。
4. 性格测试别大意。我身边就有技术面过了但性格测试没过的案例。记住两个原则:前后一致、积极正面。
5. 非科班不要自卑。面试官其实不太在意你是不是科班出身,更看重的是你的实际能力和学习态度。我在面试中主动提到了自己非科班的背景,面试官反而觉得自学能力是一种优势。
常见问题FAQ
Q:华为OD和正式员工有什么区别?
A:OD是外包身份,合同签的是德科等人力资源公司,不是直接和华为签。薪资待遇比正式员工低一些,福利也有差距。但OD转正的机会确实存在,一般绩效好的话1-2年有机会转正。
Q:机试多少分能过?
A:一般150分以上就有面试机会,但热门部门可能要求200分以上。建议目标定在250分以上,这样选择面更广。
Q:非科班能过OD面试吗?
A:完全可以。OD对学历和专业的要求相对宽松,更看重实际编码能力。我就是非科班,机试350分,面试也顺利通过了。
Q:性格测试会挂人吗?
A:会的。性格测试挂了一般可以重测,但最好一次过。关键是前后一致、积极正面,不要选太极端的选项。
Q:OD的工作强度大吗?
A:看部门,有的部门加班多,有的相对轻松。整体来说和正式员工的工作内容差不多,强度也差不多。但OD的薪资相对低一些,这点要有心理准备。