← 返回编程题库
coding-roman-to-integer-conversion简单免费版2000ms未尝试

罗马数字转整数

Roman Numeral to Integer

开始编码

给定一个罗马数字字符串 s,返回它对应的整数。七个罗马字符的固定值是 I=1, V=5, X=10, L=50, C=100, D=500, M=1000。绝大多数数字是加法记法(如 III = 3LVIII = 58MMM = 3000),但有六个特殊的两字符前缀使用减法记法:IV=4IX=9XL=40XC=90CD=400CM=900。题目保证输入是 [1, 3999] 内的合法罗马数字,且只包含这七个字符;若出现 {I, V, X, L, C, D, M} 之外的字符,必须抛 ValueError

请实现 solution(s: str) -> int。干净的做法是从左往右一次扫描并偷看下一位。对每个下标 i,查表 v = values[s[i]]。如果存在下一位且其映射值严格更大(v < values[s[i+1]]),说明当前字符处于减法位——把 v 从累加值里掉而不是加上。否则正常加上。下一轮再来正常加 s[i+1] 本身,于是减法对(如 IV-1 + 5 = 4)的总贡献恰好正确。这种写法不需要硬编码六种减法前缀,靠一行小于号就能统一处理。

Examples

solution("IV") 返回 4i=0v=1,下一位的值是 5 > 1,所以累加 -1i=1 时没有下一位,正常累加 5。合计 -1 + 5 = 4

solution("IX") 返回 9。结构与 IV 同形,只是把 V=5 换成 X=10-1 + 10 = 9。减法规则因 1 < 10 触发。

solution("MCMLXXXIV") 返回 1984。从左到右走:M 加 1000;C 后接 M=1000>100,加 -100M 加 1000;L 加 50;三个 X 各加 10(都没有更大的下一位);I 后接 V=5>1,加 -1V 加 5。合计 1000 - 100 + 1000 + 50 + 10 + 10 + 10 - 1 + 5 = 1984

签名见 stubs/stub.py

Practical context

罗马数字转整数在遗留数据导入里出现的频率远高于在算术里。监管文件、法律记录、招股书版权年、书籍版次、君主世系编号("教皇本笃十六世")、SEC 表格修订号都用罗马数字作为标识符——任何要把这些文档跟现代数字索引拼起来的系统都需要一个确定性解析器。微结构数据管线在做参考数据规范化时会撞上这种情况(比如交易所规则修订号 "Rule 612(c)(III)"、场所分级标签、MIC 子段代码偶尔嵌罗马数字),这种场景下遇到非法字符抛 ValueError 远比悄悄返回 0 要好——后者会在下游 join 时静默地污染数据。同样的「单次扫描 + 偷看一位 + 字符到整数 hash 表」模式可以推广到任何「向前看一位就能消歧」的分词器:带减法简写的 N 进制串、简单中缀算子扫描器、小型 DSL 词法器都长得一样。七项常量表 + O(n) 扫描也很好地体现了「计算一次、查表无数次」为什么比在热循环里按字符值分支要好。

约束条件

  • 1 ≤ len(s) ≤ 15
  • s 的每个字符都属于 {I, V, X, L, C, D, M}
  • s 是 [1, 3999] 内的合法罗马数字表示
  • 字符不在 {I,V,X,L,C,D,M} 内时必须抛 ValueError

样例

Case 1 · typical: subtractive IV = 4

输入: ["IV"]

期望: 4

I=1 < V=5,所以减去 I:-1 + 5 = 4。这是经典减法记法 case。

Case 2 · typical: subtractive IX = 9

输入: ["IX"]

期望: 9

I=1 < X=10,减去 I:-1 + 10 = 9。

Case 3 · typical: MCMLXXXIV = 1984

输入: ["MCMLXXXIV"]

期望: 1984

M=1000;C<M 故 -100;M=1000;L=50;X=10;X=10;X=10;I<V 故 -1;V=5。合计 1000-100+1000+50+10+10+10-1+5 = 1984。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · typical: subtractive IV = 4

输入: ["IV"]

期望: 4

I=1 < V=5,所以减去 I:-1 + 5 = 4。这是经典减法记法 case。

Case 2 · typical: subtractive IX = 9

输入: ["IX"]

期望: 9

I=1 < X=10,减去 I:-1 + 10 = 9。

Case 3 · typical: MCMLXXXIV = 1984

输入: ["MCMLXXXIV"]

期望: 1984

M=1000;C<M 故 -100;M=1000;L=50;X=10;X=10;X=10;I<V 故 -1;V=5。合计 1000-100+1000+50+10+10+10-1+5 = 1984。