半开回看滑窗下的实时成交率计数
Live Trade-Rate Count over a Half-Open Lookback Sliding Window
开始编码实现 solution(times: list[float], W: float) -> list[int]。给定一段单调非减的成交时间戳序列 times(单位为秒,自交易日开盘起算)以及一个严格为正的回看长度 W,对每个索引 i 返回 **截至索引 i 已观测到的 成交中时间戳落入 半开** 窗口 (times[i] - W, times[i]] 内的笔数。形式化地,out[i] 为满足 0 <= j <= i 且 times[i] - W < times[j] <= times[i] 的下标 j 的数量——仅前缀 times[0 .. i] 在统计范围内,未来的 tick 即便时间戳恰等于 times[i] 也不会反过来计入更早索引。右端为闭区间,故 times[i] 自身始终计入(每个索引的计数下界为一);左端为开区间,故恰好等于 times[i] - W 的成交不计入。
例
solution([0.1, 0.4, 0.9, 1.5, 1.95], 1.0) 返回 [1, 2, 3, 2, 2]。索引 0 处只有 times[0]=0.1 已发生,"过去 1.0 秒内成交数" 实时读数为 1。索引 1 处 0.1 与 0.4 都落入窗口 (-0.6, 0.4],计 2。索引 2 处窗口 (-0.1, 0.9] 容纳全部三笔,计 3。索引 3 处窗口 (0.5, 1.5] 严格剔除 0.4,仅剩 0.9 与 1.5,计 2。索引 4 处窗口 (0.95, 1.95] 严格剔除 0.9,仅剩 1.5 与 1.95,计 2。
相等时间戳由于右端为闭故彼此同处一个窗口:三笔时间戳恰好都为 t=2.0 的成交,三个索引分别报告 1, 2, 3(每一笔到达时观测到自身加之前所有同时刻的成交均在回看内)。
输入为空时返回 []。函数骨架见 stubs/stub.py。
实践背景
实时成交率计数器是各家微结构监控大盘的基础原语:极短回看(如过去 50 毫秒、过去 1 秒)内突然涌出大量成交,往往是新闻到达、延迟套利活跃或母单切片集中下发的领先信号,风险阈值常直接套在该计数上。半开区间的形状不是细枝末节——明确"恰好 W 秒之前的那一笔"是否仍记入,会让两种不同的速率估计在批量同戳的 tick 数据上给出明显不同的结果。计数器需随 tick 流式实时更新,实现必须为 O(N) 而非每 tick 重算,这正是单调双指针扫法成为标准答案的原因。
约束条件
- 0 <= len(times) <= 5000;每个元素为有限非负浮点数,单位为秒。列表单调非减;同时刻的批次成交(相等时间戳)合法且彼此互相计入
- W 为严格大于 0 的有限浮点数;典型量级为 1e-6 到 1e3 秒
- 回看区间为半开形状 `(times[i] - W, times[i]]`;恰好落在开端点 `times[i] - W` 上的成交 **不计入**,而 `times[i]` 本身始终 **计入**
- 输出为长度 N、与输入下标对齐的整数计数列表;输入为空返回空列表
- 参考比对方式为整数精确比对,对答案不引入任何浮点容差
样例
Case 1 · statement-example: five-tick stream W=1.0
输入: [[0.1,0.4,0.9,1.5,1.95],1]
期望: [1,2,3,2,2]
对每个时刻,统计其前 1.0 秒(开区间在左、闭区间在右)内的成交次数。t=0.1 仅自身在区间,计 1;t=0.4 含自身与 0.1 计 2;t=0.9 含 0.1, 0.4, 0.9 三笔计 3;t=1.5 时左边界 0.5 严格大于 0.4,故 0.4 落出,仅 0.9 与 1.5 在内计 2;t=1.95 时左边界 0.95,严格大于 0.9 落出,仅 1.5 与 1.95 在内计 2。
Case 2 · statement-example: equal timestamps batch up and all count
输入: [[2,2,2,2.5,3.5],1]
期望: [1,2,3,4,1]
“当前 tick 时刻已发生的成交” 的计数。索引 0 处仅自身一笔计 1;索引 1 处含 times[0] 与 times[1] 两笔等于 2.0 的成交均位于 (1.0, 2.0] 中计 2;索引 2 处三笔 2.0 全部计 3。索引 3 时刻 2.5 的窗口为 (1.5, 2.5],三笔 2.0 仍在内加自身共 4。索引 4 时刻 3.5 的窗口为 (2.5, 3.5],2.0 已严格小于等于 2.5 落出,2.5 等于开区间端点亦落出,仅 3.5 在内计 1。
Case 3 · statement-example: empty trade stream
输入: [[],1]
期望: []
成交流为空,直接返回空列表。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: five-tick stream W=1.0
输入: [[0.1,0.4,0.9,1.5,1.95],1]
期望: [1,2,3,2,2]
对每个时刻,统计其前 1.0 秒(开区间在左、闭区间在右)内的成交次数。t=0.1 仅自身在区间,计 1;t=0.4 含自身与 0.1 计 2;t=0.9 含 0.1, 0.4, 0.9 三笔计 3;t=1.5 时左边界 0.5 严格大于 0.4,故 0.4 落出,仅 0.9 与 1.5 在内计 2;t=1.95 时左边界 0.95,严格大于 0.9 落出,仅 1.5 与 1.95 在内计 2。
Case 2 · statement-example: equal timestamps batch up and all count
输入: [[2,2,2,2.5,3.5],1]
期望: [1,2,3,4,1]
“当前 tick 时刻已发生的成交” 的计数。索引 0 处仅自身一笔计 1;索引 1 处含 times[0] 与 times[1] 两笔等于 2.0 的成交均位于 (1.0, 2.0] 中计 2;索引 2 处三笔 2.0 全部计 3。索引 3 时刻 2.5 的窗口为 (1.5, 2.5],三笔 2.0 仍在内加自身共 4。索引 4 时刻 3.5 的窗口为 (2.5, 3.5],2.0 已严格小于等于 2.5 落出,2.5 等于开区间端点亦落出,仅 3.5 在内计 1。
Case 3 · statement-example: empty trade stream
输入: [[],1]
期望: []
成交流为空,直接返回空列表。