← 返回编程题库
coding-fix-tag-extract中等免费版2000ms未尝试

FIX 风格 tag 取值:在管道分隔消息中取数字 tag 的首个值

FIX-Style Tag Extract: First Value for a Numeric Tag in a Pipe-Delimited Message

开始编码

实现 solution(msg: str, tag: int) -> str。一条 FIX 风格的行情/订单消息由若干 key=value 键值对组成,键值对之间以 SOH 的替代字符 |(pipe)分隔,整体打成一个 ASCII 字符串。给定消息 msg 与一个整数 tag tag(>= 1),返回 tag 在消息中首个(最左侧)出现位置对应的 value;若 tag 不存在,返回 ""

例如 solution("35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|", 11) 返回 "ORD-12345"。解析器从左向右扫一遍消息,将每段在首个 = 处切成 key/value 两半,并把整数 key 前缀与 str(tag) 比对。

需要明确的细节:tag <= 0 必须抛 ValueError,且这一校验最先执行——在检查 msg 之前(因此 solution("", 0)ValueError 而不是返回 "");tag 校验通过后,msg == "" 立即返回 "";尾部 | 合法,连续 || 也合法(空段静默跳过)。完全没有 = 的段(例如 "badpair")也静默跳过而非崩溃。空值(例如 "55=|")是合法的键值对,对 tag=55 返回 ""。同一个 tag 重复出现时,返回首次出现的值。

实现禁止使用 re 模块,只能用字符串索引与切片;解析器必须在 O(N) 内完成(N = len(msg))。

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

实践背景

一个跑在 FIX session 上的行情归一化层每秒会看到成千上万条这样的 key=value 字符串:35=D 表示 new-order-single,11=ClOrdID,55=Symbol,49/56 是 sender/target comp ID 等。一个非常常见的工具函数就是"给我 tag X 的值,但不要重建整张 dict"——单条消息往往携带 30+ 个 tag,而每一跳通常只关心其中一两个,因此命中即返回的单趟扫描比把整段 split 成 dict 要明显便宜。之所以偏向"首次出现",是因为同一条消息体内 tag 重复多半是畸形喂送信号(或者是合规的 repeating-group,真正的 FIX 库会单独处理)——保留最早的那个值能让下游规则引擎依赖的原始顺序语义不被破坏。

约束条件

  • 0 <= len(msg) <= 20000,其中 msg 为 FIX 风格管道分隔字符串
  • 1 <= tag <= 99999;tag <= 0 必须抛 ValueError
  • msg 使用 ASCII 可打印字符,结构分隔符只有 '|' 与 '='
  • 允许尾部 '|';连续 '||' 视为一个空段并按畸形段静默跳过
  • 输出为 Python str,使用精确比对;tag 不存在时返回 ""

样例

Case 1 · statement-example: tag 11 is ORD-12345

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",11]

期望: "ORD-12345"

例题输入:tag 11 对应 ClOrdID,值为 'ORD-12345'。

Case 2 · visible: tag 35 at the very beginning is 'D'

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",35]

期望: "D"

tag 35 位于首段,值为 'D'。

Case 3 · visible: tag 99 absent returns empty string

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",99]

期望: ""

消息中不存在 tag 99,返回 ''。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: tag 11 is ORD-12345

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",11]

期望: "ORD-12345"

例题输入:tag 11 对应 ClOrdID,值为 'ORD-12345'。

Case 2 · visible: tag 35 at the very beginning is 'D'

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",35]

期望: "D"

tag 35 位于首段,值为 'D'。

Case 3 · visible: tag 99 absent returns empty string

输入: ["35=D|49=SENDER|56=TARGET|55=SYM-1|11=ORD-12345|",99]

期望: ""

消息中不存在 tag 99,返回 ''。