顺丰 AI 全栈笔试:30 道选择加两道编程题复盘
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 选择题共 30 道:Java 基础、前端(Vue 与 React 都有)、408 相关内容。
- 编程题一:输入矩形的长宽(r、c),分析这个矩形能否由 2×2 和 1×2 的小矩形组成;如果可以,求出最少用到的小矩形数量。
- 编程题二(加油站的变体):输入目的地、初始油量、站点数,以及每个站点的位置和油量,求是否可以到达;如果可以,求最少加油次数。
《参考解析》
矩形拼合:先判可行,再算最少块数
两个小矩形(2×2 与 1×2)面积都是偶数,所以 r×c 为奇数时一定无解。面积为偶数则一定有解:最朴素的做法是全部用 1×2 铺满,只要每一行长度 c 为偶数就行;若 c 是奇数(此时 r 必为偶数),改成沿列铺同样成立。也就是说”面积偶数”既是必要条件也是充分条件(这里假定 1×2 允许旋转,如果题目限定方向固定,可行性与块数都要重推)。
求最少块数等价于”最多能用多少个 2×2”。设 2×2 用了 k 个、1×2 用了 m 个,由 rc = 4k + 2m 得总块数 = k + m = rc/2 − k,所以要让 k 尽量大。把行两两配对、列两两配对,最多能放下 floor(r/2) * floor(c/2) 个 2×2(用四色染色可以证明这是上界:每个 2×2 恰好占用四类格子各一个,而最小那类格子的数量就是 floor(r/2) * floor(c/2));剩下的边条——r 为奇数时余一行、c 为奇数时余一列——长度都是偶数,能全部用 1×2 补齐。于是答案就是 rc/2 − floor(r/2) * floor(c/2)。
这类题失分很少是思路问题,多半是实现:r、c 稍大 r*c 就溢出 int,要用 64 位;只判了”两维都 ≥ 2”的贪心路径,漏掉退化成一条(r=1 或 c=1)的情况;输入可能多组、也可能要先做合法性判断。拿到部分分之后,先按公式自己对一遍小数据,比反复换贪心写法有效。
加油站变体:回溯为什么会超时,正解是贪心加堆
用回溯(每个站点加或不加,再用”总油量不足”和”到不了下一站”剪枝)在站点数变大后就退化成指数级,剪枝只能救平均值、救不了最坏情况,这正是只过 36% 且超时的原因。正解是贪心:车往前开,把沿途经过的每个站点当成”以后可以回来加的油”压进最大堆;当剩余油量不足以到达下一站时,就从堆里取出能加的最大油量(累加一次加油次数),还不足以到达则说明不可达。每一步都取当前可用的最大油量,等价于”用最少的次数补齐缺口”,时间复杂度 O(n log n)。实现上要注意:站点位置可能不是按顺序给的,先排序;总油量加所有站点油量小于总路程可以直接判不可达,但这一步只是提速,不能替代上面的循环;n 较大时避免用递归。
选择题的范围:Java 基础 + 前端 + 408
岗位名叫”AI 全栈”,笔试却是通用后端、前端与计算机基础的大杂烩。复习的性价比顺序可以这样排:Java 侧抓集合与 HashMap 原理、并发(线程状态、锁、线程池参数)、JVM 内存与 GC、异常与 IO;前端侧抓 Vue 的响应式实现(Proxy 与 defineProperty 的差别)、生命周期、computed 与 watch 的区别,React 的 hooks 规则、依赖数组与 diff/key;408 侧把常见数据结构与复杂度、进程线程与调度、TCP 握手与拥塞控制、Cache 与流水线过一遍。30 道题跨三栈,先扫高频题再补目标 JD 里点名的技术栈,比从教材第一页看起划算得多。
关于”Go 还是 Java”的复盘
这次秋招最值得记的是这段流水账:美团简历挂、百度笔试挂、vivo 与传音测评挂、拼多多简历秒挂、错过携程的笔试。其中两件事是能立刻改的。一是语言选择要跟着岗位供给走——Go 在国内后端岗位的数量明显少于 Java,转语言的机会成本应该用投递命中率衡量,而不是用喜好衡量;已经投出去的简历不会因为语言换回去就自动变强,但可选岗位池会立刻变大。二是”错过笔试”这种纯执行层面的损失完全可以避免:给每次投递建一条带截止时间的台账,测评和笔试链接当天就做掉(很多测评挂是毫无准备直接开始导致的)。简历挂、笔试挂不必过度归因,投递密度与时间管理才是自己能控制的变量。