← 返回编程题库
coding-day-over-day-counterparty-symmetric-diff简单免费版2000ms未尝试

对手方轮动指示器:日间对称差大小序列

Counterparty Rotation Indicator: Day-Over-Day Symmetric-Difference Series

开始编码

实现 solution(daily_blotters: list[list[int]]) -> list[int]。一支交易台把每日成交记录登记为一条 blotter——一个整数对手方 ID 列表,每个 ID 表示一笔成交对面那家公司或交易台。daily_blotters[d] 是第 d 日的 blotter,同一日内同一对手方可以多次出现(每笔成交一项),但本指标关心的只是成员信号:交易台今日是否与该对手方做过单。

对于每个连续日对 (d-1, d)(其中 d1M-1),计算两日去重对手方集合的对称差大小——也就是恰好出现在 set(daily_blotters[d-1])set(daily_blotters[d]) 之一、但不同时出现在两者中的对手方 ID 数量。按日对顺序返回长度为 M-1 的非负整数序列。

solution([[101, 102, 103, 102], [102, 104], [104, 104, 105, 102]]) 返回 [3, 1]。第 0 日 blotter 含重复的 102,但去重集合是 {101, 102, 103}。第 1 日去重集合是 {102, 104}。对称差是 {101, 103, 104}——101103 出现在第 0 日但不在第 1 日,104 出现在第 1 日但不在第 0 日,102 在两日都出现因此抵消——首项输出为 3。第 2 日 blotter [104, 104, 105, 102] 塌缩为 {102, 104, 105}。与第 1 日 {102, 104} 的对称差是 {105},第二项输出为 1

需要明确的细节:M == 0 返回 []M == 1 同样返回 []——单日无法形成连续日对。某一日 blotter 为 [],则该日去重集合为空,对应位的对称差大小等于另一日去重集合的大小;连续两日均为空贡献 0。两日去重集合相同时,该位置的输出恰为 0(不是"无该项")——只要 M >= 2,输出长度始终为 M - 1

朴素的 O(N_total * M) 重算——每对日都从头重建两日集合——在题目给定边界下也能跑完,但最干净的写法是单遍扫描:携带前一日的去重集合向前推进,每步只构造新一日的集合,返回 len(prev ^ cur)。整体工作量随 N_total(所有日 blotter 长度之总和)线性增长。

实现细节由 stubs/stub.py 提供。

实践背景

每个交易日盘后,盘后分析常会产出一条对手方轮动指示器序列——一个按连续日对刻画的信号,反映交易台的对手方集合从昨日到今日漂移了多少。日间对称差大小较大,意味着交易台今日与昨日的对手方差异显著,常与流量冲击、交易台主题切换、或更宏观市场状态触发的轮动事件相吻合。该值长期偏低——大量 0 与小数——则表明交易台一直在循环使用同一批对手方关系,关系簿处于稳定期。之所以选用对称差大小,而不是单看"新增"或"减少",是因为轮动可以由两个方向中任何一个表达,把两半同等对待才让序列具备对称性、便于跨时段自比。集合语义(而非频次加权)在这里是对的——指标问的是"关系是否活跃",而不是"流过几笔单";今日只触一笔的对手方与今日触五十笔的对手方,对当日"活跃对手方"画像贡献相同,这正是轮动指示器要的输入。

约束条件

  • 0 <= M <= 1000,其中 M 为 len(daily_blotters)
  • 对每一日 d,0 <= len(daily_blotters[d]) <= 200
  • 所有日 blotter 长度之总和不超过 5000
  • 每个对手方 ID 为非负整数,且不超过 1e9
  • 输出为长度 max(0, M - 1) 的 list[int](M <= 1 时为空),按精确比对

样例

Case 1 · statement-example: 3-day blotter rotation

输入: [[[101,102,103,102],[102,104],[104,104,105,102]]]

期望: [3,1]

第 0 日去重集 {101,102,103};第 1 日 {102,104};对称差 {101,103,104} 大小为 3。第 1 日 {102,104};第 2 日 {102,104,105};对称差 {105} 大小为 1。

Case 2 · visible: stable counterparty mix produces zero diffs

输入: [[[10,20,30],[30,20,10],[10,30,20]]]

期望: [0,0]

三日去重集均为 {10,20,30},连续两个对称差均为 0。

Case 3 · visible: single-day input returns empty series

输入: [[[1,2,3]]]

期望: []

M=1 没有连续日对,返回空列表。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement-example: 3-day blotter rotation

输入: [[[101,102,103,102],[102,104],[104,104,105,102]]]

期望: [3,1]

第 0 日去重集 {101,102,103};第 1 日 {102,104};对称差 {101,103,104} 大小为 3。第 1 日 {102,104};第 2 日 {102,104,105};对称差 {105} 大小为 1。

Case 2 · visible: stable counterparty mix produces zero diffs

输入: [[[10,20,30],[30,20,10],[10,30,20]]]

期望: [0,0]

三日去重集均为 {10,20,30},连续两个对称差均为 0。

Case 3 · visible: single-day input returns empty series

输入: [[[1,2,3]]]

期望: []

M=1 没有连续日对,返回空列表。