一. 题目
- 题目
- 实例
二. 方法一:暴力
-
解题思路
- 遍历整个字符串
- 考虑字符串中每一种组合形式
- 求出和即可
-
解题代码
def romanToInt(s: str) -> int: sum1 = 0 i = 0 # 后面加一个空格的原因是, 后续判断中有判断当前字符和后一个字符的情况, # 如果不加不加空格, 有可能出现异常 s = s + " " size = len(s) # 这里-1的原因就是减掉之前空格的长度 while i < size - 1: if s[i] == 'M': sum1 += 1000 elif s[i] == 'C' and s[i + 1] == 'M': sum1 += 900 i += 1 elif s[i] == 'D': sum1 += 500 elif s[i] == 'C' and s[i + 1] == 'D': sum1 += 400 i += 1 elif s[i] == 'C': sum1 += 100 elif s[i] == 'X' and s[i + 1] == 'C': sum1 += 90 i += 1 elif s[i] == 'L': sum1 += 50 elif s[i] == 'X' and s[i + 1] == 'L': sum1 += 40 i += 1 elif s[i] == 'X': sum1 += 10 elif s[i] == 'I' and s[i + 1] == 'X': sum1 += 9 i += 1 elif s[i] == 'V': sum1 += 5 elif s[i] == 'I' and s[i + 1] == 'V': sum1 += 4 i += 1 elif s[i] == 'I': sum1 += 1 i += 1 return sum1
-
分析
时间复杂度: O(1)
空间复杂度: O(1)
三. 方法二:
-
解题思路
- 先将字符串中每个字符按照对应的数值进行相加
- 然后考虑每种特殊情况, 减掉之前多加的部分
-
解题代码
def romanToInt(s: str) -> int: sum1 = 0 # 将字符串中每个字符按照对应的数值相加 for ele in s: if ele == "M": sum1 += 1000 elif ele == 'D': sum1 += 500 elif ele == 'C': sum1 += 100 elif ele == 'L': sum1 += 50 elif ele == 'X': sum1 += 10 elif ele == 'V': sum1 += 5 elif ele == 'I': sum1 += 1 # 处理特殊情况 if ("CM" in s) or ("CD" in s): sum1 -= 200 if ("XL" in s) or ("XC" in s): sum1 -= 20 if ("IV" in s) or ("IX" in s): sum1 -= 2 return sum1
-
分析
时间复杂度: O(1)
空间复杂度: O(1)