面灵AI→

用友秋招笔试:两道 AC + 提前交卷复盘

轮次
笔试
时间
2026-09
来源
牛客网

《面试题目》

  1. 给定一个数组和目标值,求有多少个连续子数组的元素和小于等于目标值。
  2. 按给定规则处理「相同 id 下的分叉」,构造并输出对应结果(输入输出格式较绕)。
  3. 解析 JSON 后处理业务:合并区间。
  4. 解析 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 下可能出现分叉」——即一个节点有多个子节点,输出时要按输入顺序、层级缩进或指定前缀展开。

稳妥的做法:

  1. 先建索引:用 map<id, node> 存所有节点,map<parentId, vector<id>> 记录每个父节点的子节点列表,按读入顺序 push,不要用无序容器破坏顺序。
  2. 找根:没有出现在 parent 集合里的 id(或显式指定的 root),注意可能有多个根或存在孤儿节点,要不要报错看题目要求。
  3. 按规则的遍历方式输出:DFS(前序)还是 BFS,是否需要缩进/编号/连接符,兄弟节点的顺序是输入顺序还是 id 排序——这些细节必须逐字读题,原帖被「搞死」多半就死在这里。
  4. 自己造小样例验证:拿题目给的示例跑一遍,再补一个「一个父节点三个子节点」的样例,检查输出格式(尤其行尾空格、最后一行换行)。

第三题:合并区间的标准写法

合并区间是模板题,核心两步:按左端点排序,然后一次扫描,能接上就合并、接不上就收尾。

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 而丢掉两道」要好。另外,「骗分」也是合规策略——把题面给的测试用例逻辑写死或先跑通部分用例,能拿的分先拿到手,这也是原帖作者在后一场里总结出的经验。