用友软件开发岗笔试:4 道编程题,3 道限 JS/Java
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 签到题:数组 + 简单模拟(原帖未展开描述)。
- 给定
(name, val)列表,先按 val 从小到大排序,val 相同的按 name 出现顺序排序,然后输出流程字符串(以start/end作为开头和结尾);注意对于 val 相同的多个 name 需要先fork_val再join_val。 - 输入是 JSON 字符串,主要任务是合并日期区间。
- 给定一个汇率交换的关系列表(注意是单向关系,本质上有向图),求:① 货币 A 换成货币 B 能得到的最大汇率;② 货币 A 换成货币 B 的最小交换次数和对应的交换方案。
《参考解析》
第二题:多关键字排序 + 分组格式化
排序键是 (val, 原始下标),用稳定排序或者显式带上下标即可保证同 val 时按出现顺序排。按 val 分组后,组内只有一个元素就直接串 prev->name、name->next;组内多于一个元素时先插 prev->fork_val,再让每个 name 挂到 fork 下面,收尾插 join_val 并接到 next。以题面样例(A 1 / B 2 / C 2)为例:start->A、A->fork_2、fork_2->B、fork_2->C、B->join_2、C->join_2、join_2->end。这题逻辑不难,但边界(空列表、只有一个元素、最后一组)和输出格式要一次对齐,否则会反复 WA。
第三题:JSON 日期区间合并
Python 一行 json.loads 就能拿到数组,Java 需要 Jackson / Gson,题面里给的那段手写解析代码说明它并不打算考解析本身。合并前先把每个区间转成可比大小(datetime.date,或者「距 1970-01-01 的天数」),再按起点排序线性扫一遍:若 next.start <= cur.end + 1 天 就并入当前区间并更新 cur.end = max(cur.end, next.end),否则结算当前区间、开新区间。坑点就是「相邻也算重叠」——[1,3] 和 [4,6] 必须合并成 [1,6],写成 next.start <= cur.end 会漏掉这种用例。
第四题:汇率图上的最大乘积与最少兑换次数
边是单向的、边权是正数汇率,所以第一问是最大乘积路径:取对数把乘法变加法后用最长路思路,或者直接 Floyd 变形 rate[i][j] = max(rate[i][j], rate[i][k] * rate[k][j])。要主动说明有环的情况:如果存在乘积大于 1 的环,理论上可以无限套利、最大值不存在,工程上应按「限定兑换次数」收敛或者直接判定套利。第二问每条边代价都是 1,BFS 求最短路即可,同时用 parent 数组记录前驱,从终点回溯出兑换方案;如果要求字典序最小或多解任选,也要说清判定规则。两问输入都是 JSON,写的时候把解析和算法分开,别把时间耗在字符串处理上。
关于语言限制
3 道题限 JS / Java,本质是考这两门语言自带的容器与 JSON 序列化能力(Java 的 HashMap / TreeMap / Arrays.sort,Node 的 Map 和 JSON.parse)。平时主刷 Python 的选手至少要准备一套「读标准输入 + 解析 JSON + 排序输出」的 Java 模板,否则题再简单也写不出来——这也是原帖第四题直接交卷的原因。另外笔试前先看清楚每题的语言开关,同一场考试里换语言要重新适应输入输出格式,很费时间。