罗马数字转整数:解题思路与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)。
三、解题思路:一次遍历,相邻比较
核心思想:遍历罗马数字字符串时,通过比较当前字符和下一个字符的数值,决定“加”或“减”。
具体步骤:
-
建立映射表:用字典存储罗马字符到数值的对应关系(方便快速查询)。
-
遍历字符串:从左到右逐个处理字符,同时检查下一个字符(若存在):
-
若 当前字符值 < 下一个字符值:说明是特殊情况,结果减去当前值(如 IV 中, I 需被减去)。
-
若 当前字符值 ≥ 下一个字符值:说明是常规情况,结果加上当前值(如 III 中,每个 I 都累加)。
- 指针移动:无论哪种情况,处理完当前字符后,指针后移一位(特殊情况时,下一个字符会在后续循环中处理)。
四、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 # 返回结果

477

被折叠的 条评论
为什么被折叠?



