← 返回编程题库
coding-notional-by-venue-ranked中等免费版2000ms未尝试

按场所聚合的成交名义额排行榜

Notional by Venue, Ranked

开始编码

每天收盘后,交易系统组要给业务方出一张场所贡献排行榜:当天的成交流被切片之后,按上送场所(VEN-A / VEN-B / VEN-C / 暗池…)汇总两件事——笔数总名义额(notional = 价格 × 数量的累加)。这张排行榜是后续场所返佣对账、路由策略复盘、流动性分析的输入:哪个场所撑起了今天的流量、哪个场所虽然单笔大但笔数稀薄、哪个新接入的场所还需要继续观察。和很多日终批处理一样,原始成交流里夹杂着脏数据:缺字段、venue 字段被异常网关填成 None、价格/数量字段值非法(负数、缺失),这些条目不能让整张表崩掉,但也绝不应该污染最终结果。

请实现 solution(trades: list[dict]) -> list[dict]trades 是一段按时间顺序到达的成交记录,每条记录是一个 dict,至少可能包含 venuepriceqty 等字段(也可能有别的字段,忽略即可)。请按场所聚合有效成交,返回每个场所的 {"venue": str, "count": int, "notional": float}。规范化与丢弃规则:取 venue 字段后调用 .strip(),若该字段缺失、为 None 或剥掉空白后为空字符串,整条记录被丢弃;若 priceqty 缺失、为 None、为负,或 qty == 0,整条记录也被丢弃。notional 字段是该场所所有有效成交的 price * qty 之和,最后**对总和做 round(x, 2)**(精确到分),避免不同累加顺序带来的浮点尾差。

排序是多关键字的:**先按 notional 降序——名义额最大的场所排在前面;名义额相等再按 count 降序——在贡献金额持平时,承接成交笔数更多的场所排在前面;仍然相等才按 venue 字典序升序**——保证返回顺序对相同输入是确定的。

举例:solution([{"venue": "VEN-A", "price": 100.0, "qty": 100}, {"venue": "VEN-B", "price": 50.0, "qty": 250}, {"venue": "VEN-A", "price": 100.0, "qty": 80}, {"venue": " VEN-B ", "price": 50.0, "qty": 100}, {"venue": "VEN-C", "price": 200.0, "qty": 10}]) 应返回 [{"venue": "VEN-A", "count": 2, "notional": 18000.0}, {"venue": "VEN-B", "count": 2, "notional": 17500.0}, {"venue": "VEN-C", "count": 1, "notional": 2000.0}]。VEN-A 两笔,名义额 100·100 + 100·80 = 18000.0;VEN-B 两笔( VEN-B 剥空白后等价于 VEN-B),50·250 + 50·100 = 17500.0;VEN-C 一笔,200·10 = 2000.0。按名义额降序排,VEN-A > VEN-B > VEN-C。

20 万条记录的体量下,请用单遍扫描 + 字典聚合 + 一次排序,整体复杂度 O(n + k log k),其中 k 是不同场所数。

约束条件

  • 0 ≤ len(trades) ≤ 200000
  • 每条 trade 是形如 `{"venue": str, "price": float, "qty": int, ...}` 的字典,可能还包含其他字段;只需读这三项
  • `venue` 是大小写敏感的;比较前对取出的字段调用 `.strip()`,剥掉首尾空白后再聚合并作为返回字段
  • 若 `venue` 字段缺失、为 `None`、或剥掉空白后为空字符串,则该笔成交被丢弃,不计入任何场所
  • 若 `price` 或 `qty` 缺失、为 `None`,或两者中任意一个 < 0,则该笔成交被丢弃;`qty == 0` 同样被视作无效成交并丢弃
  • 返回值是 list[dict],每个 dict 形如 `{"venue": str, "count": int, "notional": float}`,其中 `notional = round(sum(price * qty), 2)`
  • 排序:先按 `notional` 降序;若相等再按 `count` 降序;若仍相等按 `venue` 字典序升序

样例

Case 1 · example from statement (three venues, clear ranking)

输入: [[{"venue":"VEN-A","price":100,"qty":100},{"venue":"VEN-B","price":50,"qty":250},{"venue":"VEN-A","price":100,"qty":80},{"venue":" VEN-B ","price":50,"qty":100},{"venue":"VEN-C","price":200,"qty":10}]]

期望: [{"venue":"VEN-A","count":2,"notional":18000},{"venue":"VEN-B","count":2,"notional":17500},{"venue":"VEN-C","count":1,"notional":2000}]

VEN-A 两笔合计 100·100+100·80=18000.0;VEN-B 两笔(带空白的 ` VEN-B ` 等价 VEN-B),50·250+50·100=17500.0;VEN-C 一笔 200·10=2000.0。按 notional 降序,VEN-A > VEN-B > VEN-C。

Case 2 · tie on notional broken by count, then by venue alpha

输入: [[{"venue":"VEN-D","price":100,"qty":100},{"venue":"VEN-E","price":50,"qty":100},{"venue":"VEN-E","price":50,"qty":100},{"venue":"VEN-F","price":100,"qty":100}]]

期望: [{"venue":"VEN-E","count":2,"notional":10000},{"venue":"VEN-D","count":1,"notional":10000},{"venue":"VEN-F","count":1,"notional":10000}]

三家场所名义额都恰好 10000.0:先按 count 降序,VEN-E 两笔排第一;VEN-D 与 VEN-F 都是一笔,再按 venue 字典序升序,VEN-D 排在 VEN-F 之前。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · example from statement (three venues, clear ranking)

输入: [[{"venue":"VEN-A","price":100,"qty":100},{"venue":"VEN-B","price":50,"qty":250},{"venue":"VEN-A","price":100,"qty":80},{"venue":" VEN-B ","price":50,"qty":100},{"venue":"VEN-C","price":200,"qty":10}]]

期望: [{"venue":"VEN-A","count":2,"notional":18000},{"venue":"VEN-B","count":2,"notional":17500},{"venue":"VEN-C","count":1,"notional":2000}]

VEN-A 两笔合计 100·100+100·80=18000.0;VEN-B 两笔(带空白的 ` VEN-B ` 等价 VEN-B),50·250+50·100=17500.0;VEN-C 一笔 200·10=2000.0。按 notional 降序,VEN-A > VEN-B > VEN-C。

Case 2 · tie on notional broken by count, then by venue alpha

输入: [[{"venue":"VEN-D","price":100,"qty":100},{"venue":"VEN-E","price":50,"qty":100},{"venue":"VEN-E","price":50,"qty":100},{"venue":"VEN-F","price":100,"qty":100}]]

期望: [{"venue":"VEN-E","count":2,"notional":10000},{"venue":"VEN-D","count":1,"notional":10000},{"venue":"VEN-F","count":1,"notional":10000}]

三家场所名义额都恰好 10000.0:先按 count 降序,VEN-E 两笔排第一;VEN-D 与 VEN-F 都是一笔,再按 venue 字典序升序,VEN-D 排在 VEN-F 之前。