> 文章列表 > 13. 罗马数字转整数

13. 罗马数字转整数

13. 罗马数字转整数

题目

罗马数字包含以下七种字符:I,V,X,L,C,D和MI, V, X, L,C,D 和 MIVXLCDM
例如, 罗马数字 222 写做 IIIIII ,即为两个并列的 111121212 写做 XIIXIIXII ,即为 X+IIX + IIX+II 。 $27 $写做 XXVIIXXVIIXXVII, 即为 XX+V+IIXX + V + IIXX+V+II
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 444 不写做 IIIIIIIIIIII,而是 IVIVIV。数字 111 在数字 555 的左边,所表示的数等于大数 555 减小数 111 得到的数值 444 。同样地,数字 999 表示为 IXIXIX。这个特殊的规则只适用于以下六种情况:
III 可以放在 V(5)V (5)V(5)X(10)X (10)X(10) 的左边,来表示 444999
XXX 可以放在 L(50)L (50)L(50)C(100)C (100)C(100) 的左边,来表示 404040909090
CCC 可以放在 D(500)D (500)D(500)M(1000)M (1000)M(1000) 的左边,来表示 400400400900900900
给定一个罗马数字,将其转换成整数。

例子

  1. 输入: s="LVIII"s = "LVIII"s="LVIII"
    输出: 585858
    解释: L=50,V=5,III=3.L = 50, V= 5, III = 3.L=50,V=5,III=3.
  2. 输入: s="MCMXCIV"s = "MCMXCIV"s="MCMXCIV"
    输出: 199419941994
    解释: M=1000,CM=900,XC=90,IV=4.M = 1000, CM = 900, XC = 90, IV = 4.M=1000,CM=900,XC=90,IV=4.

思路

这道题的思路如果想到就很简单,但是想不到就很复杂。从左往右依次遍历,按照对应的罗马数字值依次相加,用"MCMXCIV""MCMXCIV""MCMXCIV"举例,[M=1000+CM=(−100+1000)=900]=1900[ M = 1000 + CM = (-100 + 1000)=900 ] = 1900[M=1000+CM=(100+1000)=900]=1900 ,因此,我们可以看到当出现左边的数字小于右边的数字时,左边的数字要以负数相加。

  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)
class Solution:def romanToInt(self, s: str) -> int:dict = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}num = 0# 遍历字典的键值for i in range(len(s)-1):# 左边的数比右边大时相加if dict[s[i]] >= dict[s[i+1]]:num += dict[s[i]]# 左边的数比右边小时相减else:num -= dict[s[i]]# 为了防止溢出,i知道倒数第二个字符,因此还需要加上最后一个字符,不需要判断,因为最后一个肯定是正数num += dict[s[len(s)- 1]]return num