用友笔试第二场:四道编程题复盘
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 给一个重量数组和每天能运送的重量上限,必须按顺序搬物品且不能超过每日上限,求最少需要多少天。
- 纯 IO 模拟:给一段配置,输出这段配置对应的节点流转。例如输入
要输出A 1 B 2 C 2 D 3start->A A->fork_1 A->fork_2 fork_2->B fork_3->C B->join_1 C->join_1 join_1->D D->end - 解析 JSON 后处理业务:时间区间合并。
- 解析 JSON 后处理业务:有向图相关。
原帖复盘:第 1 题是签到题,AC;第 2 题调了半天「给我调力竭了」;第 3、4 题给的解析器代码不能复制、题目详情页的表格显示不全,只能手动输入;好处是这几题都能用测试用例骗到分。
《参考解析》
第一题:二分答案 + 贪心校验
题目是经典模型:物品必须按顺序搬运、每天总重量不超过上限,求最少天数。因为天数与「每天上限」的关系单调(上限越大天数越少),可以对天数做二分,也可以用更直接的思路——顺着原数组贪心累加,超过上限就开新的一天:
def min_days(weights, cap):
days, cur = 1, 0
for w in weights:
if w > cap: # 单个物品就超上限,无解
return -1
if cur + w > cap:
days += 1
cur = w
else:
cur += w
return days
复杂度 O(n)。如果题目反过来给「天数」求「最小运载能力」(LeetCode 1011 的形态),就用二分答案 + 上面的贪心做 check:二分 cap 落在 [max(weights), sum(weights)],对每个 mid 用 O(n) 校验天数是否 ≤ 给定值,总体 O(n log sum)。这类题有三个易错点:① 单个物品超过上限时的处理(返回无解还是允许当天只搬它);② 天数从 1 开始而不是 0;③ 边界取 left = max(weights) 而不是 0,否则会死循环或算错。
第二题:fork/join 结构的输出模拟
这题是纯模拟,考的是把语义读懂并准确落地。从示例可以看出模型:配置里的第二个数字是层级/深度,同一层的节点会分叉成 fork_n,多个分叉在下一层汇合时产生 join_n,最后接 end。这类题的通用做法:
- 按层级分组:读入所有
(名称, 层级),按层级分桶,同时保留输入顺序。 - 建立流转关系:
start连到第一层节点;一个父节点若有多个子节点,就生成fork_1…fork_k(编号全局递增,示例里 A 的两个分叉是 fork_1、fork_2,C 用的是 fork_3),子节点分别接在各自的 fork 后面;多个子节点汇到同一个下一层节点时生成join_n,由join_n连到该节点(示例里 B、C 汇到 join_1,join_1 再连 D)。 - 处理最后一层:最后一层的节点直连
end。 - 逐行输出,注意换行与顺序(是不是按生成顺序、是否按层级排序),最后一行是否要换行。
调试建议:把示例输入硬编码进本地脚本先跑通,再改成读标准输入;输出用 '\n'.join(lines) 一次性打印,避免多次 print 带来的格式差异。原帖说「调半天给我调力竭了」,通常就是踩在编号规则(fork/join 的计数是全局的还是每层重置)和输出顺序上——这两点必须拿题目示例反推验证。
第三题:时间区间合并
和前一场的合并区间是同一类题,只是输入变成 JSON 里的时间对象。步骤固定:
- 解析:把 JSON 里的时间字段读出来,统一转成可比较的形式。时间最好转成时间戳或
(时, 分)元组再比较,直接比字符串只在格式完全一致时可靠。 - 排序:按开始时间升序。
- 扫描合并:
if cur.start <= last.end: last.end = max(last.end, cur.end),否则开启新区间。必须取 max,否则被包含的区间会把右端点缩小。 - 输出格式:按题目要求还原成时间字符串,注意补零(
09:05vs9:5)、跨天区间、以及边界相接(09:00-10:00与10:00-11:00是否算重叠)这几处细节。
第四题:有向图常见考点
「JSON 输入 + 有向图」的题型无非几种,先把可能的考点列全,读题时对号入座:
- 拓扑排序:判断能否排出一个合法顺序(有环则不能),用入度数组 + 队列(Kahn 算法);要求按字典序输出就用优先队列。
- 环检测:DFS 三色标记(白/灰/黑)或并查集(无向图),有环时报出环上节点。
- 可达性/路径:BFS/DFS,或 Floyd、Dijkstra(带权最短路)。
- 连通分量/关键路径:并查集或 Tarjan(强连通分量),项目排期类题目会问最长路径(关键路径法,可用拓扑序上 DP)。
- 节点与边的建模:注意 JSON 里可能给的是边列表、邻接表或父子关系,要先转成统一的邻接表再算;节点 id 可能是字符串,需要先映射成下标。
笔试环境的坑:题目不能复制、表格显示不全
原帖遇到的两个环境问题是很多在线笔试的通病,且都有应对办法:
- 解析器代码不能复制:如果允许开本地编辑器,就先手敲一小份最小解析器(或者自己写十几行 JSON 解析/tokenize)在本地调试;也可以只把输入样例敲进本地文件,逻辑写完再贴回在线环境。
- 详情页表格显示不全:把浏览器缩放调小、或用开发者工具改样式/直接看接口返回;也可以截图后放大看。别凭猜测做题,规则错一个字整题就废。
- 善用「骗分」:原帖明确说这几题都能用测试用例骗分——意思是把题面给出的样例直接判断输出,或者对部分输入范围写特判,先拿下部分用例。这是合规且高效的策略:先把分数锁住,再优化通用解。