罗马数字转整数:解题思路与Python实现

罗马数字转整数:解题思路与Python实现

一、问题背景

罗马数字转整数 (对应 LeetCode 第 13 题)。罗马数字的表示规则有其独特性,既包含“从左到右累加”的常规情况,也存在“左小右大则相减”的特殊规则

二、罗马数字规则分析

罗马数字由 7 个基本字符组成,对应数值如下:

字符 I V X L C D M
数值 1 5 10 50 100 500 1000

2.1 常规情况(累加)

若 左边字符的数值 ≥ 右边字符,则直接累加。例如:

  • III → 1+1+1=3

  • XII → 10+1+1=12

2.2 特殊情况(减法)

若 左边字符的数值 < 右边字符,则表示“右边值 - 左边值”。仅存在 6 种特殊组合:

  • I 接 V (4)、 I 接 X (9);

  • X 接 L (40)、 X 接 C (90);

  • C 接 D (400)、 C 接 M (900)。

三、解题思路:一次遍历,相邻比较

核心思想:遍历罗马数字字符串时,通过比较当前字符和下一个字符的数值,决定“加”或“减”。

具体步骤:

  1. 建立映射表:用字典存储罗马字符到数值的对应关系(方便快速查询)。

  2. 遍历字符串:从左到右逐个处理字符,同时检查下一个字符(若存在):

  • 若 当前字符值 < 下一个字符值:说明是特殊情况,结果减去当前值(如 IV 中, I 需被减去)。

  • 若 当前字符值 ≥ 下一个字符值:说明是常规情况,结果加上当前值(如 III 中,每个 I 都累加)。

  1. 指针移动:无论哪种情况,处理完当前字符后,指针后移一位(特殊情况时,下一个字符会在后续循环中处理)。

四、Python 代码实现(带详细注释)

  class Solution:
    def romanToInt(self, s: str) -> int:
        # 罗马字符到数值的映射表
        r = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        res = 0  # 结果初始化为 0
        n = len(s)  # 字符串长度
        i = 0       # 遍历指针
        while i < n:
            c = r[s[i]]  # 当前字符对应数值
            if i < n - 1:
                nxt = r[s[i+1]]  # 下一个字符对应数值
                if c < nxt:
                    res -= c  # 特殊情况,减当前值
                    i += 1
                else:
                    res += c  # 常规情况,加当前值
                    i += 1
            else:
                res += c  # 最后一个字符,直接加
                i += 1
        return res  # 返回结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值