面灵AI→

华为27校招软件算法一二面面经:项目深挖与手撕hot100

轮次
一面+二面
结果
二面挂
时间
2026-09
来源
牛客网

《面试题目》

技术一面

  1. 请做自我介绍,并介绍一下你的项目。
  2. 你项目里用到的算法,原理是什么?
  3. 你在项目中遇到过什么难题,是怎么解决的?
  4. 手撕:给定一个数组和整数 k,求和为 k 的最短子数组,返回该子数组的长度(先讲思路,再写核心代码)。
  5. 反问环节:这个部门的业务方向和工作模式是怎样的?

技术二面

  1. 请做自我介绍,并展开讲一遍你的项目。
  2. 项目里的模型是怎么选型的,依据是什么?
  3. 你所用的算法,原理是什么?
  4. 项目落地过程是怎样的,实际效果如何?
  5. 手撕:打家劫舍,写出核心代码。

《参考解析》

这场面试的分工是「一面看基本盘、二面看项目是不是你亲手做的」。 流程上 8 月投递、9 月初机考、9 月 22~24 日面试,一面开场先宣读全程录音等规则,再进自我介绍,面试官会边听边从你的项目里挑点提问。一面问题整体不难,主线是「介绍项目 → 追问里面的算法原理 → 你遇到的难题怎么解决 → 手撕一道 hot100 → 反问」,属于筛掉明显不合格的人。二面才是拉开差距的地方:同样从自我介绍起手,但会从模型选型的依据一路追到算法原理、再到落地过程和实际效果,每个环节都要往下多挖一层。二面每个部分都问得很细,而作者自述答得不好、已挂——说明这一轮的区分度几乎全在项目深挖上。

项目深挖要准备的,是每个技术选择背后的「为什么不是另一个」。 面试官的追问路径基本固定:先问为什么选这个方案(模型、框架、算法都算),再问它的原理是什么,最后问落到业务上效果如何、指标从哪来。所以每个关键决策都要能给出三个东西——当时的约束(数据量、时延、成本、团队成本)、对比过的备选方案、以及最终取舍掉的那部分代价。讲难题不要只报结论,按「现象 → 怎么定位 → 试过哪些方案 → 最后怎么解 → 留下什么坑」讲完,这一段最能证明项目真是你做的。另外原帖作者提到面试官中途会点头,那个不一定是肯定,别把节奏判断建立在对方的微表情上,按自己的提纲讲完。

手撕一:和为 k 的最短子数组。 这类「子数组和等于 k」的题,动笔前先跟面试官确认数组里有没有负数、以及不存在解时返回什么——这一步比抢着写代码得分高。数组全为正数时可以用滑动窗口:右指针一路扩张累加,窗口和大于 k 就收缩左指针,每收缩一次若和恰好等于 k 就更新最短长度,时间 O(n)、空间 O(1)。但只要出现负数,窗口的单调性就不成立,得换成前缀和加哈希表:把 prefix[j] = nums[0] + ... + nums[j-1] 逐个算出来,只记录每个前缀和最早出现的下标,遍历到 j 时查 prefix[j] - k 在表里最早出现在哪,两者距离就是以 j 结尾的最短长度;写代码时记得把 prefix = 0、下标 = -1 预先塞进表,否则从首元素开始的解会被漏掉。

手撕二:打家劫舍,以及这道题的两句话原理。 状态定义是「偷到第 i 家为止能拿到的最大金额」,转移式 dp[i] = max(dp[i-1], dp[i-2] + nums[i]) 对应两个选择:不偷第 i 家就沿用前一家的结果,偷第 i 家就不能偷第 i-1 家,于是接上 dp[i-2] 再加本次金额。因为只依赖前两项,用两个变量滚动就能把空间压到 O(1);边界上 n 为 0 返回 0、n 为 1 返回 nums[0],这两行写错比转移式写错更常见。面试里被追问变体时,环形版本(首尾相邻)的做法是拆成「必不偷最后一家」和「必不偷第一家」两次线性求解取较大值,树形版本则在后续遍历里向上返回「偷 / 不偷」两个值做取舍——能说出拆分思路就够,不必现场全写。