罗马数字转整数的核心逻辑是:
- 基础规则:通常罗马数字中,数值大的字符在左,小的在右,直接累加即可(如
VI = 5+1=6); - 特殊规则:若小数值字符出现在大数值字符左侧(如
IV、CM),表示用大数减小数(IV=5-1=4、CM=1000-100=900); - 简化处理:遍历字符串时,若当前字符的数值小于下一个字符的数值,则减去当前值;否则加上当前值。最后再加上最后一个字符的数值(避免越界)。
代码实现(Python)
python
运行
def romanToInt(s: str) -> int:
# 定义罗马字符到数值的映射表
roman_map = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
total = 0
n = len(s)
# 遍历前n-1个字符(避免i+1越界)
for i in range(n - 1):
current = roman_map[s[i]]
next_val = roman_map[s[i+1]]
# 若当前值 < 下一个值,减去当前值;否则加上
if current < next_val:
total -= current
else:
total += current
# 加上最后一个字符的数值
total += roman_map[s[-1]]
return total
代码解释
-
映射表:
roman_map存储所有罗马字符对应的整数,方便快速取值; -
遍历处理:
- 遍历到倒数第二个字符(
range(n-1)),避免i+1超出字符串索引; - 对比当前字符和下一个字符的数值:若当前值更小(如
I在V前),则减去当前值(后续加下一个值时,等价于next - current);否则直接累加;
- 遍历到倒数第二个字符(
-
收尾处理:最后单独加上最后一个字符的数值(因为它没有下一个字符可对比,直接累加即可)。
测试用例验证
python
运行
# 示例1
print(romanToInt("III")) # 3
# 示例2
print(romanToInt("IV")) # 4
# 示例3
print(romanToInt("IX")) # 9
# 示例4
print(romanToInt("LVIII"))# 58
# 示例5
print(romanToInt("MCMXCIV")) # 1994
复杂度分析
- 时间复杂度:O (n),n 是罗马数字的长度,仅需遍历一次字符串;
- 空间复杂度:O (1),仅使用了固定大小的映射表和几个变量,空间消耗与输入规模无关。
该解法逻辑简洁,无需处理复杂的特殊情况枚举,通过 “减当前值” 的方式统一处理所有特殊规则,是罗马数字转整数的最优解法之一。