成交带异常检测:找出重复次数最多的成交指纹
Tape-Anomaly Detector: Most-Repeated Trade Fingerprint
开始编码实现 solution(trades: list[list]) -> list。某行情台监控正在扫一段从交易场地拿到的成交带,每一行 trades[i] 都是一个三元组 [price, size, side](side 为 'B' 表示买方主动、'S' 表示卖方主动)。返回这段窗口内出现次数最多的三元组——也就是成交"指纹"——以 3 元列表 [price, size, side] 的形式给出。若有两组以上并列最大次数,返回其中首次出现位置最早的那一组。输入为空时返回 []。
例:solution([[100.5, 10, 'B'], [101.0, 5, 'S'], [100.5, 10, 'B'], [101.0, 5, 'S'], [100.5, 10, 'B']]) 返回 [100.5, 10, 'B']。三元组 (100.5, 10, 'B') 出现 3 次,(101.0, 5, 'S') 出现 2 次。再看 solution([[100.0, 1, 'B'], [101.0, 1, 'S'], [101.0, 1, 'S'], [100.0, 1, 'B']]):两组都各自出现 2 次,但 (100.0, 1, 'B') 首次出现在下标 0,而 (101.0, 1, 'S') 首次出现在下标 1,因此返回 [100.0, 1, 'B']。
需要明确的细节:空输入精确返回 [](不是 None、不是用零填充的三元组);side 是单个 ASCII 字符,所以 'B' 与 'b' 视为不同(题目输入只走大写,但实现不能做隐式归一化);price 浮点取值已确保相等比较良好,请直接用原值组键,不要做四舍五入。
用一个以 (price, size, side) 元组为键的哈希字典,同时配一份用于平局规则的 first_index,一次线性扫描即可结束 O(N)。在该规模下朴素 O(N^2) 也尚可跑完,但哈希字典版实现更清爽,尤其是平局规则——首次出现下标在键首次插入时直接记下,省得后面再回头去找。
实现细节由 stubs/stub.py 提供。
实践背景
成交带上短时间内反复出现的相同三元组,是行情台做"一眼瞥"诊断时的常见信号:一个在窗口内反复出现的指纹,往往指向某条算法主动单的特征、某种延迟套利的探针式打点,或者更糟——薄成交场地上的对敲嫌疑。研究侧在回放分钟级成交带时,也会把"重复次数最多的指纹"作为深入分析前的健康检查,因为它能用一次线性扫描把这段窗口里"最响"的重复模式单独剥出来。把平局规则锚到"首次出现位置最早"是刻意为之:当多种主动单模式重复次数并列时,运维更想把结果钉在最早的证据上,这样同一窗口反复回放得到的指纹一致,下游告警逻辑也保持确定性。
约束条件
- 0 <= N <= 1700,其中 N 为 solution(trades) 的输入长度
- 每行都是 3 元列表 [price: float, size: int, side: str],price 取值保证可整齐对齐、相等比较定义良好
- size 为正整数,side 严格等于 'B' 或 'S' 之一
- 输入为空时返回 [];否则返回 [price, size, side],保持元素类型不变
- 在并列最大次数的三元组中,按输入中首次出现最早作为平局规则;输出使用逐元素的精确比对
样例
Case 1 · statement-example: top fingerprint by count
输入: [[[100.5,10,"B"],[101,5,"S"],[100.5,10,"B"],[101,5,"S"],[100.5,10,"B"]]]
期望: [100.5,10,"B"]
三元组 (100.5, 10, B) 出现 3 次,(101.0, 5, S) 出现 2 次,因此返回 [100.5, 10, B]。
Case 2 · visible: tie broken by earliest first occurrence
输入: [[[100,1,"B"],[101,1,"S"],[101,1,"S"],[100,1,"B"]]]
期望: [100,1,"B"]
两个三元组都出现 2 次,(100.0, 1, B) 首次出现在下标 0 早于 (101.0, 1, S) 的下标 1,因此返回前者。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: top fingerprint by count
输入: [[[100.5,10,"B"],[101,5,"S"],[100.5,10,"B"],[101,5,"S"],[100.5,10,"B"]]]
期望: [100.5,10,"B"]
三元组 (100.5, 10, B) 出现 3 次,(101.0, 5, S) 出现 2 次,因此返回 [100.5, 10, B]。
Case 2 · visible: tie broken by earliest first occurrence
输入: [[[100,1,"B"],[101,1,"S"],[101,1,"S"],[100,1,"B"]]]
期望: [100,1,"B"]
两个三元组都出现 2 次,(100.0, 1, B) 首次出现在下标 0 早于 (101.0, 1, S) 的下标 1,因此返回前者。