likes
comments
collection
share

罗马数↔整数

作者站长头像
站长
· 阅读数 41

罗马数字基本知识

本文是关于面试经典 150 题 - 学习计划 - 力扣(LeetCode) 中罗马数字问题的汇总。

罗马数字包含以下七种字符: I, V, X, LCD 和 M

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

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

再细说一下转化规则:

I代表1 V代表5 X代表10 L代表50 C代表100 D代表500 M代表1000

这些符号可以组合在一起来表示不同的数字。罗马数字的组合规则如下:

  1. 当较小的数字在大数字的右边时,将它们相加;例如:VI = V + I = 5 + 1 = 6。

  2. 当较小的数字在大数字的左边时,将大数字减去小数字;例如:IV = V - I = 5 - 1 = 4。

  3. 同样地,组合数字的时候也可以遵循以上两个规则;例如:XIV = X + IV = 10 + 4 = 14。

因此,将一个罗马数字字符串转换为整数的方法就是按照以上规则将各个符号对应的值相加或相减得到对应的整数。

罗马数字转整数

class Solution:
    def romanToInt(self, s):

        d = {'I': 1,
             'V': 5,
             'X': 10,
             'L': 50,
             'C': 100,
             'D': 500,
             'M': 1000}

        num = 0

        for i in range(len(s)-1,-1,-1):
            if i == len(s) - 1:
                num += d[s[i]]
                continue
            if d[s[i]] < d[s[i + 1]]:
                num -= d[s[i]]
            else:
                num += d[s[i]]
        return num

该函数使用了一个字典来存储每个罗马数字字符对应的整数值,并从输入字符串的末尾开始遍历,依次将每个字符的对应值加到结果中。如果前面的字符比当前字符对应的值小,则说明需要减去前面的值。

下面是代码的具体解释:

  • 创建一个字典d,将每个罗马数字字符与其对应的整数值关联起来。

  • 初始化变量num为0。

  • 从字符串末尾开始遍历,依次处理每个字符。

  • 如果当前字符是最后一个字符,将其对应的值加到num中。

  • 如果当前字符对应的值小于下一个字符对应的值,则将当前值减去num;否则将当前值加到num中。

  • 遍历结束后,返回num作为结果。

因为该算法只需要遍历一次输入字符串,所以时间复杂度为O(n),其中n为罗马数字字符串的长度。因为该算法没有使用额外的数据结构,所以空间复杂度为O(1),即常数级别的空间开销。

整数转罗马数字

class Solution:
    def intToRoman(self, num: int) -> str:
        d = {1000: 'M', 900: 'CM', 500: 'D', 400: 'CD',
             100: 'C', 90: 'XC', 50: 'L', 40: 'XL', 
             10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}
        roman = ''

        for n, s in d.items():
            count = num // n
            roman += s * count
            num -= n * count

        return roman

该函数使用一个字典来存储每个整数与其对应的罗马数字字符串。函数从字典中遍历每个整数,然后计算整数中包含的相应数量,并将相应数量的罗马数字字符串连接到结果字符串中。函数返回的是最终的罗马数字字符串。

下面是代码的具体解释:

  1. 创建一个字典d,将每个整数与其对应的罗马数字字符串关联起来。

  2. 初始化一个空字符串roman来存储最终的罗马数字字符串。

  3. 遍历字典d中的每个整数n及其对应的罗马数字字符串s。

  4. 计算num中包含n的数量count。

  5. 将count个罗马数字字符串s连接到roman字符串中。

  6. 减去n * count。

  7. 遍历结束后,返回roman字符串作为结果。

因为该算法只需要遍历字典d中的每个整数,所以时间复杂度为O(1)。因为该算法只使用了字典和几个变量,所以空间复杂度为O(1),即常数级别的空间开销。

转载自:https://juejin.cn/post/7225276454716588089
评论
请登录