用友秋招笔试:两道 AC + 提前交卷复盘
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 给定一个数组和目标值,求有多少个连续子数组的元素和小于等于目标值。
- 按给定规则处理「相同 id 下的分叉」,构造并输出对应结果(输入输出格式较绕)。
- 解析 JSON 后处理业务:合并区间。
- 解析 JSON 后处理业务(原帖未记录具体内容)。
原帖复盘:第 1 题一趟遍历不断求和,10 分钟 AC;第 2 题在「相同 id 下注意分叉」上被输入输出搞得很惨,最后 AC;第 3、4 题看到 JSON 就不想写了,题目给了 JSON 解析器但不能复制,第 3 题本身是合并区间、难度不高,最终 3、4 全部放弃提前交卷。
《参考解析》
第一题:连续子数组和小于等于目标值
这题是典型的滑动窗口,但有一个必须主动说明的前提——数组元素是否全为正数:
- 全为正数(或非负):窗口右端扩张时和单调不减,左端收缩时和单调不增,于是可以双指针一次扫完,时间 O(n)、空间 O(1)。
def count_subarrays(nums, target):
left = cur = ans = 0
for right, x in enumerate(nums):
cur += x
while cur > target and left <= right:
cur -= nums[left]
left += 1
ans += right - left + 1 # 以 right 结尾的合法子数组个数
return ans
- 存在负数:上面的单调性不成立,滑窗会漏解,正确做法是前缀和 + 有序结构(对每个位置统计有多少个前缀和 ≥
prefix[i] - target,用树状数组/归并或平衡树维护,O(n log n)),或者元素范围很小时用计数数组。
面试/笔试时最好把「我假设元素均为正」这句话说出来,或先问清数据范围——这既是正确性问题,也是沟通习惯的体现。另一个易错点是空子数组算不算:按题目口径决定计数从 right - left + 1 还是 right - left 起。
第二题:相同 id 下的分叉怎么建结构
这类题没有算法难度,考的是把输入输出规则读懂并准确复现。通常的形态是:每行给一个 id 和 parent_id(或层级),要还原成一棵多叉树并按指定顺序输出,难点在「同一个 id 下可能出现分叉」——即一个节点有多个子节点,输出时要按输入顺序、层级缩进或指定前缀展开。
稳妥的做法:
- 先建索引:用
map<id, node>存所有节点,map<parentId, vector<id>>记录每个父节点的子节点列表,按读入顺序 push,不要用无序容器破坏顺序。 - 找根:没有出现在 parent 集合里的 id(或显式指定的 root),注意可能有多个根或存在孤儿节点,要不要报错看题目要求。
- 按规则的遍历方式输出:DFS(前序)还是 BFS,是否需要缩进/编号/连接符,兄弟节点的顺序是输入顺序还是 id 排序——这些细节必须逐字读题,原帖被「搞死」多半就死在这里。
- 自己造小样例验证:拿题目给的示例跑一遍,再补一个「一个父节点三个子节点」的样例,检查输出格式(尤其行尾空格、最后一行换行)。
第三题:合并区间的标准写法
合并区间是模板题,核心两步:按左端点排序,然后一次扫描,能接上就合并、接不上就收尾。
def merge(intervals):
intervals.sort(key=lambda x: x[0])
res = []
for s, e in intervals:
if res and s <= res[-1][1]: # 有重叠(或相邻,看题目)
res[-1][1] = max(res[-1][1], e) # 注意取 max,区间可能被包含
else:
res.append([s, e])
return res
三个细节决定能不能 AC:① 合并条件是 s <= last_end(相邻算不算重叠要看题);② 更新右端点必须取 max,否则 [1,10] 后面接 [2,3] 会把结果缩成 [1,3];③ 输入可能本身无序,别忘了排序。如果区间带边界开闭性([1,3) 与 [3,5]),判断条件改成严格小于。
第四题:笔试里的 JSON 解析题怎么应对
原帖放弃的原因是「给了解析器但不能复制」——这是很多在线笔试环境的真实痛点。可操作的对策:
- 提前确认能不能用本地编辑器:绝大多数笔试允许开本地 IDE,那就把题面里的 JSON 结构手动敲进本地文件(只需敲一次),在本地调试好再把代码贴回去。
- 别抄整段,只抄关键字段:JSON 解析题的重点通常是遍历/查询/转换逻辑,不是 JSON 本身。抄一个最小可用样例就够验证。
- 用截图代替抄写:如果环境允许截图(本地工具或系统截图),截下来放在旁边看,减少反复找题面的时间。
- 时间分配:这类题分值未必高但坑多,若前两题已完成且剩余时间不足,判断一下「解析 + 业务逻辑」的总工作量再决定做不做了,不要卡在抄写环节上。
这场笔试的复盘(提前交卷值不值)
原帖作者的心态很真实:秋招后期疲惫,看到 JSON 就不想写了。客观地说,第 3 题是合并区间、难度不高,放弃两道题对通过率的影响可能比想象中大——很多笔试是按题目通过数或总分划线的,一道中等题往往就是分水岭。更划算的做法是:先把第 3 题(明确的合并区间)用 10 分钟拿下来,第 4 题看不懂就直接放弃,这样比「因为不想抄 JSON 而丢掉两道」要好。另外,「骗分」也是合规策略——把题面给的测试用例逻辑写死或先跑通部分用例,能拿的分先拿到手,这也是原帖作者在后一场里总结出的经验。