顺丰 9.24 Java 笔试:矩形填充与最少加油次数
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 选择题(30 题,共 60 分):单选与多选混合,覆盖面很广,含少量算法题。
- 编程题一:给定一个 r×c 的矩形,用 1×2 和 2×2 两种小矩形去填充,判断能否恰好填满;若能,返回最少需要多少个小矩形。
- 编程题二:给定路的总长度、初始油量,以及沿途各加油站的位置与可加油量,判断能否到达终点;若能,返回最少需要加几次油。
《参考解析》
矩形填充的最少块数(贪心)
块数最少等价于「让 2×2 的块尽可能多」。先看面积:r×c 为奇数时必然填不满,直接判不可行。面积为偶数时,若 r、c 都是偶数,可以整块用 2×2 铺满,答案是 r×c/4;若两者一奇一偶,奇数的那一维铺不下 2×2,最多只能覆盖 (r-1)×c 个格子用 2×2,余下一整行(长度为偶数)用 1×2 补齐,答案就是 (r-1)×c/4 + c/2。逐行贪心铺即可,不需要搜索。
这题有个非常典型的坑:r、c 本身可能不大,但面积与计数相乘仍会溢出 int,第一遍只过 80% 多的用例常常就出在这里——把参与乘法与累加的变量一律声明成 long,是交卷前最划算的一次检查。
最少加油次数:贪心 + 大顶堆
标准模型是「反悔贪心」。从起点往终点开,把沿途经过的加油站的可加油量全部压进一个最大堆;当剩余油量不足以走到下一个加油站(或终点)时,就从堆顶弹出最大的一次加油量,相当于反悔——假装刚才在那里加过油,加油次数加一,然后判断油量是否够用。堆为空仍走不到,说明到不了终点。
复杂度是 O(n log n)。如果写成「贪心加回溯」,通过率通常很低:暴力枚举「在哪些站加油」会随站点数指数膨胀,而堆把「选最大的那几次」这件事降成了对数级的取极值,这才是本题的预期解。
选择题的取舍
30 道客观题 60 分、单选多选混排,考的是知识面宽度而非深度,临场最容易卡在「见过但记不清细节」上。两道编程题都是标准贪心,40 分比在选择题上纠结更好拿,做题顺序上建议先拿编程题的分。