大厂真题 / 百度

百度 2026-07-30 后端研发岗笔试真题

  • 考试时间:2026 年 7 月 30 日
  • 考试岗位:后端研发岗
  • 题型构成:15 道单选题、5 道多选题、1 道算法编程题、1 道 Prompt 题、1 道 AI Coding 题
  • 整体难度:中等

本场笔试明显强调混合能力:选择题覆盖操作系统、数据库、网络、算法、机器学习和大模型应用;算法题考查前缀余数与滑动窗口;另外还要求设计可稳定执行计费规则的 Prompt,并借助 AI 完成信贷工程题。


选择题(15 单选 + 5 多选)

一、单选题

1. 工单摘要的幻觉抑制

后端团队接入大模型生成工单摘要,希望模型不要编造原始工单中没有的信息。更合适的提示约束是?

  • A. 提高生成随机性,让模型输出更多候选表达
  • B. 限定依据原始工单内容总结,缺失信息标为未提供
  • C. 把摘要长度固定得更长,以容纳更多推测细节
  • D. 要求模型优先补充背景原因,使摘要看起来更完整

答案:B

解析:抑制幻觉的关键是限定事实来源,并为缺失信息提供“未提供”这一合法输出。提高随机性、拉长回答或主动补背景都会增加编造风险。

2. Linux 文件权限

Linux 文件权限显示为 -rw-r-----。若某用户属于该文件所属组,但不是文件所有者,则该用户对该文件通常具有什么权限?

  • A. 仅可读
  • B. 无权限
  • C. 可执行但缺少读取权限
  • D. 可读可写

答案:A

解析:权限依次对应所有者 rw-、所属组 r--、其他人 ---。该用户命中所属组权限,因此只能读取。

3. RAG 检索到旧制度

某制度问答系统采用 RAG,但回答会引用过期制度。检索日志显示 Top-K 片段相似度较高,但混有旧版本制度。下列改进更能直接缓解该问题的是?

  • A. 提高生成 temperature,让模型用更丰富表述融合多版制度内容
  • B. 缩短最终答案长度,减少暴露过期引用细节的机会
  • C. 在召回和重排阶段加入版本、生效时间和来源过滤,再注入命中片段
  • D. 继续扩大 Top-K,使新旧版本都有机会进入上下文,由模型综合判断

答案:C

解析:根因是旧版本片段进入了上下文,应在检索与重排阶段按版本、时间和来源过滤,而不是把确定性的版本判断交给生成模型。

4. 事务并发读问题

事务 T1 第一次读取某行余额为 100。事务 T2 随后提交更新,把余额改为 120。T1 在同一事务内再次读取同一行得到 120。该现象更贴近哪类并发读问题?

  • A. 幻读:条件范围内行集合变化
  • B. 死锁:事务之间形成循环等待
  • C. 不可重复读:同一行两次读取变化
  • D. 脏读:读取其他事务未提交数据

答案:C

解析:同一事务对同一行的两次读取结果不同,且第二次读到的是已提交值,属于不可重复读。幻读关注范围查询的行集合变化。

5. 活动选择问题

给定若干活动的开始和结束时间,希望选出数量最多的互不重叠活动。下列贪心策略通常可用于该问题并可通过交换论证证明正确的是?

  • A. 每次选择开始时间最早的可选活动
  • B. 每次选择与其他活动重叠最多的活动
  • C. 每次选择持续时间最长的可选活动
  • D. 每次选择结束时间最早的可选活动

答案:D

解析:优先选择结束最早的活动,可以为后续活动留下尽可能大的时间空间,这是经典区间调度贪心。

6. 排序稳定性

某列表中存在多个排序键相同的记录,业务要求排序后这些记录仍保持原来的相对先后顺序。下列算法性质最贴近该要求的是?

  • A. 稳定排序
  • B. 外部排序
  • C. 分治排序
  • D. 原地排序

答案:A

解析:稳定排序的定义就是相等键元素在排序后保持原相对次序;外部、分治和原地描述的是其他维度的性质。

7. 精确率与召回率

某风控场景更关注减少误拦正常用户。验证集上模型 M1 的 $TP=80$、$FP=20$、$FN=40$,模型 M2 的 $TP=70$、$FP=10$、$FN=50$。若主要按“被判高风险的请求中确实高风险的比例”取舍,下列判断更合理的是?

  • A. 选 M2:$Recall=70/(70+50)$,高于 M1 的 $Recall$
  • B. 选 M2:$Precision=70/(70+10)$,高于 M1 的 $Precision$
  • C. 选 M1:$FP=20$、$FN=40$,误拦更少且覆盖更高
  • D. 选 M1:$Precision=80/(80+20)$,$Recall=80/(80+140)$

答案:B

解析:“预测为高风险者中真正高风险的比例”是精确率。M1 为 $0.8$,M2 为 $0.875$,故选择 M2。M2 的召回率反而低于 M1。

8. Linux 日志统计

某日志文件 app.log 中每行仅包含一个三位 HTTP 状态码且无其他内容。希望统计状态码 500 出现的行数,下列命令更符合该目标的是?

  • A. grep '500' app.log | wc -l
  • B. grep -v '500' app.log | wc -c
  • C. wc -l app.log | grep '500'
  • D. cat app.log > grep '500' | wc

答案:A

解析:先用 grep 筛出状态码为 500 的行,再用 wc -l 统计行数。其余选项或反向匹配、或统计字节、或命令顺序及重定向错误。

9. 进程与线程资源

某后端服务把一个耗时任务拆成多个线程在同一进程内执行。下列关于这些线程与进程资源关系的说法较合理的是?

  • A. 线程切换时会重新创建进程页表,因此开销通常高于进程切换
  • B. 同进程线程共享同一地址空间,但各自有栈和调度上下文
  • C. 多个线程并发执行时不涉及同步问题,因为它们共享同一份内存
  • D. 线程拥有独立地址空间,线程间传递对象需要经过内核网络栈

答案:B

解析:同进程线程共享代码段、堆等资源,但分别拥有栈、寄存器和调度上下文。共享内存恰恰会引入竞态,需要同步。

10. 可恢复缺页异常

某进程执行一条访存指令时发生可恢复缺页异常。内核完成页表更新并装入目标页后,若该处理器支持精确异常,用户态执行流通常如何恢复?

  • A. 重启当前进程,从 main 函数入口重新执行
  • B. 恢复到触发缺页的访存指令,由该指令重新执行
  • C. 从异常处理程序入口继续执行原用户逻辑
  • D. 跳过触发缺页的访存指令,从下一条指令继续执行

答案:B

解析:缺页是 fault 类异常。页面装入后应回到触发异常的指令重新执行,不能跳过尚未完成的访存。

11. 支付回调幂等性

某支付回调接口可能因网络抖动被调用方重试。为了避免同一业务事件被重复处理,服务端设计中最关键的是?

  • A. 要求客户端把超时时间调得更短,让失败更快暴露
  • B. 在响应体中返回更详细日志,由调用方自行排查
  • C. 按事件唯一编号做幂等校验,重复请求返回已处理结果
  • D. 把接口从 HTTPS 改成 HTTP,降低 TLS 握手开销

答案:C

解析:重试不可避免,服务端应使用订单号或事件 ID 等业务唯一键去重,使同一事件只产生一次业务副作用。

12. MySQL 联合索引

MySQL 表 orders 上有联合索引 (user_id, status, create_time)。下列查询条件最符合该索引最左前缀使用方式的是?

  • A. WHERE user_id = 1001 AND status = 1
  • B. WHERE status = 1 ORDER BY user_id
  • C. WHERE create_time > '2026-01-01'
  • D. WHERE status = 1 AND create_time > '2026-01-01'

答案:A

解析:A 从最左列 user_id 开始连续使用到 status;其他选项均跳过首列,不能用该索引进行标准前缀定位。

13. 二叉树结点度数

一棵非空二叉树共有 29 个结点,其中度为 1 的结点有 6 个。按二叉树结点度数关系推断,该树中度为 2 的结点数为?

  • A. 12
  • B. 13
  • C. 11
  • D. 10

答案:C

解析:设度为 0、1、2 的结点数分别为 $n_0,n_1,n_2$。二叉树满足 $n_0=n_2+1$,又有 $n_0+n_1+n_2=29$、$n_1=6$,解得 $n_2=11$。

14. Function Calling 的执行边界

某后端系统让大模型根据用户请求调用“查询订单”工具。关于 Function Calling 的执行边界,下列说法较合理的是?

  • A. 模型输出调用请求,后端校验参数并执行工具
  • B. 后端只校验参数格式,把用户身份和资源权限判断留到工具返回后再处理
  • C. 模型生成结构化调用结果后直接写入业务数据库,不经过后端执行层
  • D. 工具接口只写自然语言用途说明,参数约束由模型根据上下文临场补齐

答案:A

解析:模型只提出调用意图;参数校验、身份鉴别、权限控制与实际执行必须由可信后端完成。模型输出应始终视为不可信输入。

15. 栈操作

某服务按顺序接收操作:push(4)push(7)poppush(2)push(9)poppop。若底层结构是栈,则三次 pop 得到的元素顺序为?

  • A. 7、2、9
  • B. 9、2、7
  • C. 4、7、2
  • D. 7、9、2

答案:D

解析:栈后进先出。第一次弹出 7;再压入 2、9 后,依次弹出 9、2。

二、多选题

16. 大模型客服的安全设计

某后端团队建设大模型客服系统。为了降低幻觉和越权工具调用风险,下列设计较合理的有哪些?

  • A. 允许模型在资料不足时根据常识补全具体制度条款,提高回答完整度
  • B. 对低置信度或资料冲突的请求进入人工复核或返回无法判断
  • C. 对工具调用参数做白名单校验和权限校验,再由后端执行
  • D. 弱化检索片段来源和版本记录,把事实校验主要交给模型最终回答

答案:B、C

解析:不确定时降级到人工或明确拒答,可避免强行编造;后端白名单、鉴权和代执行可控制工具风险。A 会制造幻觉,D 会削弱可追溯性。

17. 模型上线评估

某推荐服务上线新模型前,需要评估其离线效果和线上风险。下列做法较合理的有哪些?

  • A. 上线前保留灰度或 A/B 实验方案,观察真实用户反馈
  • B. 若训练集准确率很高,就可省略线上监控和回滚预案
  • C. 关注与业务目标一致的指标,而不是只看训练损失
  • D. 用独立验证集评估模型效果,避免只看训练集表现

答案:A、C、D

解析:独立验证集用于评估泛化,业务指标用于衡量实际价值,灰度或 A/B 实验用于控制线上风险。训练集成绩不能替代监控与回滚。

18. 联合索引与执行代价

某订单表常用查询为 WHERE user_id=? AND status=? ORDER BY create_time DESC LIMIT 20。关于索引执行代价的判断,正确的有哪些?

  • A. 把 create_time 放在联合索引首列,仍能稳定利用 user_idstatus 的等值过滤前缀
  • B. 覆盖索引能否减少回表,还取决于 SELECT 列是否都在索引中
  • C. 若只有单列索引 status,低选择性状态列过滤效果可能较弱
  • D. 联合索引 (user_id, status, create_time) 有机会同时支持过滤和排序

答案:B、C、D

解析:覆盖索引要求查询所需列均在索引中;低选择性单列索引收益可能有限;等值列在前、排序列在后有机会兼顾过滤与排序。A 破坏了等值条件的最左前缀。

19. TCP 可靠传输

关于 TCP 在后端服务通信中的可靠传输机制,下列说法正确的有哪些?

  • A. TCP 会保留应用层消息边界,使接收端每次 read 都对应一次 send
  • B. TCP 通过应用层 JSON 字段校验来恢复丢失报文内容
  • C. TCP 的重传机制可在部分报文丢失时补发未确认的数据
  • D. TCP 通过序号和确认机制支持按字节流确认数据接收进度

答案:C、D

解析:TCP 依靠序号、确认与重传提供可靠字节流。它不保留应用层消息边界,可靠性也不依赖 JSON 格式。

20. 多线程共享状态

某后端服务中多个线程会同时更新共享计数器和任务队列。下列做法中,有助于降低并发错误风险的有哪些?

  • A. 在临界区中执行长时间网络请求,以减少锁释放次数
  • B. 把只读配置发布为不可变对象,减少共享状态修改
  • C. 把共享队列的入队和出队操作纳入一致的同步协议
  • D. 用互斥锁保护共享计数器的读改写临界区

答案:B、C、D

解析:不可变对象减少竞态,共享队列需遵循统一同步协议,计数器的读—改—写需锁或原子操作。持锁执行慢网络请求会放大锁竞争。


第 1 题:余数游走

题目描述

给定长度为 $n$ 的整数序列 $a_1,a_2,\ldots,a_n$ 和正整数模数 $M$。序列首尾相接,位置 $n$ 的后继为位置 $1$。

对于每个起点 $s$,从 $a_s$ 开始沿环依次取数,最多取 $n$ 个。第 $t$ 步的余数轨迹值为

\[S_t=\left(\sum_{i=0}^{t-1}a_{(s+i-1)\bmod n+1}\right)\bmod M,\qquad t\ge 1.\]

余数采用 $[0,M-1]$ 内的标准非负表示。轨迹只包含 $S_1,S_2,\ldots$,不包含尚未取数时的初始余数 0

只要下一步得到的余数已在当前轨迹中出现,游走就停止;若始终没有重复,则取满 $n$ 步后停止。记起点 $s$ 能取得的最大步数为 $L_s$,求

\[\sum_{s=1}^{n}L_s.\]

输入描述

第一行输入整数 $T$,表示测试数据组数。

每组数据:

  • 第一行输入两个整数 $n,M$;
  • 第二行输入 $n$ 个整数 $a_1,a_2,\ldots,a_n$。

完整约束:

  • $1\le T\le 10^5$;
  • $1\le n,M\le 2\times10^5$;
  • $-10^9\le a_i\le10^9$;
  • 所有测试数据的 $n$ 之和不超过 $2\times10^5$。

输出描述

对每组测试数据输出一行一个整数,表示所有起点游走长度之和。

样例

输入

2
5 3
1 2 2 1 2
4 5
5 0 5 0

输出

11
4

样例解释:第一组从起点 1 出发时,余数依次为 $1,0,2,0$,第 4 步与第 2 步重复,所以 $L_1=3$;其余四个起点的长度均为 2,总和为 11。第二组任一起点的前两步余数均为 0,所以每个起点只能走 1 步,总和为 4。

思路:前缀余数 + 双指针

将环在逻辑上复制一遍,并定义前缀余数:

\[P_0=0,\qquad P_i=\left(P_{i-1}+a_{(i-1)\bmod n+1}\right)\bmod M.\]

只需计算 $P_0$ 到 $P_{2n-1}$,因为最后一个起点最多向后取 $n$ 个数。

从起点 $s$ 走 $t$ 步所得余数可以写成

\[S_t=(P_{s+t-1}-P_{s-1})\bmod M.\]

对固定起点而言,每个轨迹值都减去同一个常数 $P_{s-1}$,因此

\[S_x=S_y\iff P_{s+x-1}=P_{s+y-1}.\]

于是,轨迹互异等价于 $P_s,P_{s+1},\ldots,P_{s+L-1}$ 两两不同。问题转化为:对前缀余数数组中的每个左端点,求长度不超过 $n$ 的最长无重复窗口。

维护窗口 [left, right] 和集合 seen。对每个 left,不断扩展只增不减的 right,直到下一个余数重复或窗口已经达到长度 $n$。此时窗口长度就是对应的 $L_s$;累加后删除左端元素,再处理下一个起点。

正确性证明

引理 1: 对固定起点 $s$,两步轨迹值相同,当且仅当对应的两个前缀余数相同。

\[S_t=(P_{s+t-1}-P_{s-1})\bmod M\]

可知所有轨迹值都由对应前缀余数减去同一个模 $M$ 常数得到。模意义下平移是双射,因此相等关系保持不变,引理成立。

引理 2: 算法处理左端点 left 时,窗口扩展结束后的长度等于该起点的最大合法游走长度。

扩展过程中集合内元素两两不同,且窗口长度不超过 $n$,所以当前窗口对应合法轨迹。若停止是因为达到 $n$,已经达到题目允许的最大步数;若停止是因为下一个余数已出现,根据引理 1,再走一步必然造成轨迹重复。因此窗口不能继续延长,引理成立。

引理 3: 右端指针无需回退。

左端右移只会从合法窗口中删除一个元素,不会制造新的重复,也不会使原右端超过新左端对应的长度上限。因此原右端对下一轮仍合法,可以继续向右扩展。

定理: 算法输出所有起点游走长度之和。

根据引理 2,算法对每个起点得到的窗口长度恰好是 $L_s$;算法逐一处理全部 $n$ 个起点并累加这些长度,所以最终结果恰为题目所求。

Python ACM 代码

import sys


def total_walk_length(n, modulus, values):
    prefix = [0] * (2 * n)
    current = 0

    for i in range(1, 2 * n):
        current = (current + values[(i - 1) % n]) % modulus
        prefix[i] = current

    seen = set()
    right = 0
    answer = 0

    for left in range(1, n + 1):
        limit = left + n - 1
        while right < limit and prefix[right + 1] not in seen:
            right += 1
            seen.add(prefix[right])

        answer += right - left + 1
        seen.remove(prefix[left])

    return answer


def solve():
    data = list(map(int, sys.stdin.buffer.read().split()))
    if not data:
        return

    iterator = iter(data)
    test_count = next(iterator)
    output = []

    for _ in range(test_count):
        n = next(iterator)
        modulus = next(iterator)
        values = [next(iterator) for _ in range(n)]
        output.append(str(total_walk_length(n, modulus, values)))

    sys.stdout.write("\n".join(output))


solve()

复杂度分析

时间复杂度:对每组数据为期望 $O(n)$。前缀余数线性生成,每个位置至多进入和离开哈希集合各一次;对全部输入则为期望 $O(\sum n)$。

空间复杂度:每组数据为 $O(n)$,用于前缀余数数组与滑动窗口集合;一次性读入还会占用与总输入规模同阶的空间。


Prompt 题:汽车洗车计算器

题目与规则

编写一个 Prompt,使大模型从用户的自然语言描述中识别洗车场景,按下列规则计费并输出 JSON。

  1. 车型基础价:小型车 38 元、SUV 58 元、MPV 78 元。
  2. 洗车类型:普通洗不加价;精洗在基础价上加 80%,结果向上取整;打蜡在基础价上加 150%,结果向上取整。
  3. 会员折扣:在洗车类型加价之后,将洗车费乘 85%,结果向下取整;非会员不变。
  4. 附加费:内饰清洁每次 28 元,发动机清洗每次 45 元。
  5. 节假日加成:节假日将“会员折扣后的洗车费 + 附加费”乘 1.2,并向上取整;非节假日直接相加。
  6. 停车费:室内停车 15 元,露天停车 0 元;停车费不参与节假日加成。

输出字段:

{
  "total_bill": 0,
  "wash_cost": 0,
  "car_type": "小型车"
}

其中 wash_cost 是节假日加成前、会员折扣后的洗车费,不含附加费和停车费;car_type 只能为“小型车”“SUV”“MPV”。评测会忽略多余字段。

题目样例

样例 1 输入

张先生不是会员,非节假日,小型车普通洗,不加附加项目,露天停车。

样例 1 输出

{"total_bill":38,"wash_cost":38,"car_type":"小型车"}

样例 2 输入

李先生是会员,节假日,SUV精洗,加内饰清洁,室内停车。

样例 2 输出

{"total_bill":156,"wash_cost":89,"car_type":"SUV"}

第二个样例按顺序计算:SUV 精洗为 $58\times1.8=104.4$,向上取整得 105;会员折扣为 $105\times0.85=89.25$,向下取整得 89;节假日部分为 $(89+28)\times1.2=140.4$,向上取整得 141;最后加室内停车费 15,合计 156。

设计要点

  • 锁定顺序:洗车类型加价、会员折扣、附加费、节假日加成、停车费必须逐步执行,不能合并取整。
  • 锁定取整方向:类型加价向上、会员折扣向下、节假日加成向上。
  • 明确字段口径wash_cost 不含附加费、节假日加成和停车费。
  • 隔离停车费:停车费必须最后加入,不能乘节假日系数。
  • 减少小数错误:把 1.8、2.5、0.85、1.2 分别写成整数乘除形式,并要求每步先得出结果再进入下一步。
  • 使用示例约束输出:一条覆盖最简单路径,另一条覆盖会员、节假日和多次取整。

参考 Prompt

# 角色
你是洗车费用结算系统。

# 任务
从用户的自然语言中识别车型、洗车类型、会员状态、节假日状态、附加项目和停车方式,并严格按以下规则计算。

价目:
- 车型基础价:小型车 38、SUV 58、MPV 78
- 洗车类型:普通洗不加价;精洗为基础价 ×18÷10;打蜡为基础价 ×25÷10
- 附加项:内饰清洁 28、发动机清洗 45
- 停车费:室内 15、露天 0

计算顺序如下,每一步取整后的结果才可进入下一步:
1. 取得车型基础价。
2. 按洗车类型加价,并向上取整。
3. 若为会员,将第 2 步结果 ×85÷100 并向下取整;非会员保持不变。
4. 第 3 步结果记为 wash_cost。
5. 将所有附加项费用求和。
6. 若为节假日,将“wash_cost + 附加费”×12÷10 并向上取整;否则直接相加。
7. 加入停车费。停车费不参与节假日加成。
8. 第 7 步结果记为 total_bill。

小数系数必须按整数乘除计算,不得把多次取整合并。car_type 只能是“小型车”“SUV”“MPV”之一。

# 输出要求
只输出合法 JSON,不要输出 Markdown 或额外说明:
{"steps":"逐项记录 1 至 8 步的算式和结果","total_bill":数字,"wash_cost":数字,"car_type":"车型"}

# 示例 1
输入:张先生不是会员,非节假日,小型车普通洗,不加附加项目,露天停车。
输出:{"steps":"1.基础价38;2.普通洗不加价38;3.非会员不打折38;4.wash_cost=38;5.附加费0;6.非节假日38+0=38;7.露天停车0,合计38;8.total_bill=38","total_bill":38,"wash_cost":38,"car_type":"小型车"}

# 示例 2
输入:李先生是会员,节假日,SUV精洗,加内饰清洁,室内停车。
输出:{"steps":"1.基础价58;2.精洗58×18÷10=104.4,向上取整105;3.会员105×85÷100=89.25,向下取整89;4.wash_cost=89;5.附加费28;6.节假日(89+28)×12÷10=140.4,向上取整141;7.室内停车15,合计156;8.total_bill=156","total_bill":156,"wash_cost":89,"car_type":"SUV"}

现在计算用户输入的场景。

AI Coding:分期借贷还款引擎

已知需求范围

公开原文将本题描述为一个 HTTP JSON 服务工程:管理信贷产品、借款人、贷款、还款计划与交易流水,并支持以下业务能力:

  • 三种还款方式:等额本息、等额本金、先息后本;
  • 放款及还款计划生成;
  • 提前还款与批量还款;
  • 逾期罚息;
  • 风险冻结;
  • 展期与减免;
  • 坏账核销、后续回收与冲正;
  • 金额精确到分,日期按自然月计算;
  • 可推进的虚拟时钟;
  • 正确的状态流转;
  • 幂等处理、LIFO 冲正,以及失败操作不得修改数据。

信息边界说明:公开原文只概述了题目,未给出考试中的完整 README。因此本文不编造具体 URL、请求响应字段、错误码、持久化格式或可运行代码;这些内容必须以考试 README 为唯一契约。

建议架构

  1. 领域模型层:信贷产品、借款人、贷款、期次计划、资金流水、业务事件与虚拟时钟。金额采用整数“分”或十进制定点数,禁止二进制浮点数进入账务计算。
  2. 规则与计算层:分别封装三种还款计划策略、自然月日期规则、罚息、提前还款、展期、减免和核销计算,避免把公式散落在路由中。
  3. 应用服务层:编排放款、还款、冻结、冲正等用例,并集中执行前置校验、状态机检查、幂等判断与事务提交。
  4. 存储层:保存实体、计划、不可变流水、幂等记录和冲正关联。所有会产生多处修改的操作必须原子化。
  5. HTTP 适配层:仅负责 JSON 解析、按 README 校验输入、调用应用服务并映射响应;不承载核心业务规则。
  6. 测试层:金额公式、月末日期、状态转换、失败回滚、重复请求、批量原子性和冲正顺序分别测试,再进行端到端联调。

实施步骤

  1. 完整读取 README,先产出“实体、字段、接口、状态、规则、错误语义、验收场景”清单,并逐项回指原文。
  2. 建立金额、日期和虚拟时钟基础设施,优先验证分级舍入及月末、闰年等边界。
  3. 建立领域实体与状态机,明确每种命令允许的前置状态和成功后的目标状态。
  4. 用策略模式实现三种还款计划,先完成正常放款与按期还款的最小闭环。
  5. 增加提前还款、逾期罚息、批量还款、冻结、展期、减免、核销与回收。
  6. 增加幂等键记录、事务边界和失败回滚;流水一经记账只追加,不直接篡改。
  7. 实现冲正关联和 LIFO 校验,确保被冲正流水与派生余额、状态、计划同步恢复。
  8. 按 README 接入 HTTP 路由,逐接口做正常、非法、重复和边界场景测试。
  9. 跑完整业务流程回归,列出已实现、未实现和不确定项;只针对证据明确的问题定点修复。

验收清单

  • 三种还款方式的每期本金、利息、尾差和总额符合 README
  • 所有金额精确到分,舍入时点和方向一致
  • 自然月、月末、跨年和闰年日期正确
  • 虚拟时钟推进后,逾期、罚息和状态变化正确
  • 正常放款、还款与提前还款的余额和计划同步更新
  • 批量操作满足 README 规定的原子性,失败不留下部分修改
  • 风险冻结后,不允许的操作被拒绝且无副作用
  • 展期、减免、核销、回收的状态及账务关系正确
  • 相同幂等请求不会重复扣款、重复记账或重复变更状态
  • 冲正严格遵循 LIFO,并可追溯原流水与冲正流水
  • 任意校验失败、状态冲突或内部异常都不修改持久状态
  • HTTP JSON 行为、字段、错误语义完全以考试 README 为准
  • 测试覆盖正常路径、边界值、非法状态、重复请求和失败回滚

这类题的重点不是让 AI 一次性“生成整个项目”,而是让它先复述契约,再分层实现、逐层测试、对照 README 验收。缺失的信息必须标记为待确认,不能用看似合理的接口或代码填空。