Skip to main content

13.罗马数字转整数

标签: greedy, string

难度: Easy

通过率: 63.49%

原题链接: https://leetcode.com/problems/roman-to-integer/description/

题目描述

罗马数字由七个不同的符号表示:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。给定一个罗马数字,将其转换为整数。

解题思路

要将罗马数字转换为整数,我们可以从左到右遍历这个字符串。对于每个字符,应该取它对应的数值。如果当前字符对应的数值小于后续字符对应的数值,说明这种组合形式表示一个“减法”模式(例如,IV代表4),我们应该将当前数值从总和中减去。如果当前字符对应的数值大于或等于后续字符对应的数值,则表示一个“加法”模式,我们应该将数值加到总和中。通过这种方式处理整个字符串,最终得到对应的整数。

代码实现

def romanToInt(s: str) -> int:
# 创建一个字典来存储罗马数字符号及其对应的整数值
roman_to_int = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}

total = 0
prev_value = 0 # 初始化前一个值为0

# 从左到右遍历字符串
for char in s:
# 获取当前符号对应的整数值
value = roman_to_int[char]

# 如果前一个值小于当前值,需要减去前一个值然后加上新的值
if prev_value < value:
total += value - 2 * prev_value # 减去之前添加的prev_value
else:
total += value

prev_value = value # 更新前一个值

return total

复杂度分析

时间复杂度为 O(n)O(n),其中 nn 是输入罗马数字的长度,因为我们需要遍历整个字符串。空间复杂度为 O(1)O(1),因为我们只需常量级的额外空间来存储映射、总和和前一个字符的值。