罗马数字转整数

44 阅读2分钟

罗马数字转整数的核心逻辑是:

  1. 基础规则:通常罗马数字中,数值大的字符在左,小的在右,直接累加即可(如 VI = 5+1=6);
  2. 特殊规则:若小数值字符出现在大数值字符左侧(如 IVCM),表示用大数减小数(IV=5-1=4CM=1000-100=900);
  3. 简化处理:遍历字符串时,若当前字符的数值小于下一个字符的数值,则减去当前值;否则加上当前值。最后再加上最后一个字符的数值(避免越界)。

代码实现(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

代码解释

  1. 映射表roman_map 存储所有罗马字符对应的整数,方便快速取值;

  2. 遍历处理

    • 遍历到倒数第二个字符(range(n-1)),避免 i+1 超出字符串索引;
    • 对比当前字符和下一个字符的数值:若当前值更小(如 I 在 V 前),则减去当前值(后续加下一个值时,等价于 next - current);否则直接累加;
  3. 收尾处理:最后单独加上最后一个字符的数值(因为它没有下一个字符可对比,直接累加即可)。

测试用例验证

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),仅使用了固定大小的映射表和几个变量,空间消耗与输入规模无关。

该解法逻辑简洁,无需处理复杂的特殊情况枚举,通过 “减当前值” 的方式统一处理所有特殊规则,是罗马数字转整数的最优解法之一。