对手方多样性诊断:滚动累计不同对手方数量
Counterparty Diversity Diagnostic: Running Distinct Counterparty Count
开始编码实现 solution(events: list[str]) -> list[int]。一位交易员接收按到达顺序排列的成交事件流 events,每个条目是一个对手方 ID(成交单另一侧的公司或交易台)。在处理完每个事件之后,返回截至当前已见的不同对手方数量——即输出的第 i 项等于 events[0..i] 中不同对手方 ID 的数量(包含第 i 位)。输出长度与输入相同;空输入返回 []。
示例
solution(["CP-1", "CP-2", "CP-1", "CP-3", "CP-2"]) 返回 [1, 2, 2, 3, 3]。第 0 个事件之后只见过 CP-1,计数为 1;第 1 个事件加入新的 CP-2,计数变为 2;第 2 个事件是 CP-1 的重复,计数维持在 2 形成平台期;第 3 个事件加入新的 CP-3,计数上升到 3;第 4 个事件是 CP-2 的重复,计数维持在 3。
需要明确的细节:空 events 返回 [];长度为 1 的输入一定返回 [1];全是同一个对手方的流返回 [1, 1, 1, ...];严格互不相同的对手方流返回 [1, 2, 3, ..., N]。对手方 ID 按精确 ASCII 身份比较——大小写、前后空白、纯数字字符串("42" 与 "42 " 与 " 42")都视为不同,因此实现必须以原值入集合,而不是经过归一化的形式。
朴素地按每步重算 len(set(events[:i+1])) 是 O(N^2),会在把 N 推到上限的隐藏用例上超时;改用全程一个已见集合、每次插入后取大小即可把整体复杂度降到 O(N)。
实现细节由 stubs/stub.py 提供。
实践背景
交易盘后,合规会产出一份对手方多样性诊断,用来呈现交易台当日的对手方覆盖随时间是如何展开的——按事件级别的滚动不同对手方计数就是其中最直白的一条曲线,它能回答诸如"交易台多快开始接触新名字""在分散到多家对手方之前,先在一两家上集中了多久"等问题。曲线上的平台期表示交易台在复用已有的对手方关系而非新接洽一家;上台阶则标记一位新对手方的首次出现。之所以用滚动计数而不是直方图或最终一次性计数,是因为合规和风险都更关心曲线的时间形状——上午一小时内就摸到 50 家对手方,与拖到收盘才到 50 家,尾值相同但集中度画像截然不同。
约束条件
- 0 <= N <= 5000,其中 N 为 solution(events) 的输入长度
- 每个 events[i] 为长度 1 到 32 之间的 ASCII 字符串——仅为合成的对手方 ID,绝非真实公司名
- 字符串区分大小写,不做任何归一化
- 空输入返回 [];否则输出长度与输入一致,每个事件对应一个滚动计数
- 输出为 list[int],其中 output[i] 等于 events[0..i] 中不同对手方的数量,使用精确比对
样例
Case 1 · statement-example: CP-1/CP-2 with mid-stream repeats
输入: [["CP-1","CP-2","CP-1","CP-3","CP-2"]]
期望: [1,2,2,3,3]
前两次都是新对手方,第三个事件是 CP-1 的重复(计数停在 2),第四个加入新 CP-3 升到 3,第五个是 CP-2 的重复(计数停在 3)。
Case 2 · visible: empty events returns empty list
输入: [[]]
期望: []
空输入直接返回空列表。
Case 3 · visible: case-sensitive distinguishes 'cp-x42' from 'CP-X42'
输入: [["cp-x42","CP-X42","cp-x42"]]
期望: [1,2,2]
字符串区分大小写,因此 'cp-x42' 与 'CP-X42' 视为两个不同对手方;第三个是 'cp-x42' 的重复,计数停在 2。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: CP-1/CP-2 with mid-stream repeats
输入: [["CP-1","CP-2","CP-1","CP-3","CP-2"]]
期望: [1,2,2,3,3]
前两次都是新对手方,第三个事件是 CP-1 的重复(计数停在 2),第四个加入新 CP-3 升到 3,第五个是 CP-2 的重复(计数停在 3)。
Case 2 · visible: empty events returns empty list
输入: [[]]
期望: []
空输入直接返回空列表。
Case 3 · visible: case-sensitive distinguishes 'cp-x42' from 'CP-X42'
输入: [["cp-x42","CP-X42","cp-x42"]]
期望: [1,2,2]
字符串区分大小写,因此 'cp-x42' 与 'CP-X42' 视为两个不同对手方;第三个是 'cp-x42' 的重复,计数停在 2。