LeetCode_12_中等_整数转罗马数字


1. 题目

罗马数字包含以下七种字符: I , V , X , L , C , D I, V, X, L,C,D IVXLCD M M M

字符数值
I I I1
V V V5
X X X10
L L L50
C C C100
D D D500
M M M1000

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

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

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

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3
输出: “III”

示例 2:

输入: num = 4
输出: “IV”

示例 3:

输入: num = 9
输出: “IX”

示例 4:

输入: num = 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示

  • 1 < = n u m < = 3999 1 <= num <= 3999 1<=num<=3999

2. 思路及代码实现(Python)

2.1 模拟法

罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则(如问题描述中所述)给出了额外的 6 个复合符号。这给了我们总共 13 个独特的符号(每个符号由 1 个或 2 个字母组成),如下图所示。

在这里插入图片描述

已知:对一个数值,优先选择尽可能大的符号值。

如上图所示,由于罗马符号是唯一表示,因此可以将这些符号和表示的值进行存储,并且每次找到不超过给定整数或剩余整数的最大符号,按需拼接,直到给定整数的剩余数值为0,即结束循环。该方法的时间复杂度取决于给定整数的大小,题目中限制了给定整数的最大值为3999,最多循环次数不超过15次,循环有一个确定的次数上限,因此时间复杂度为 O ( 1 ) O(1) O(1),空间复杂度也为 O ( 1 ) O(1) O(1)

class Solution:

    VALUE_SYMBOLS = [
        (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"),
    ]

    def intToRoman(self, num: int) -> str:
        roman = list()
        for value, symbol in Solution.VALUE_SYMBOLS:
            while num >= value:
                num -= value
                roman.append(symbol)
            if num == 0:
                break
        return "".join(roman)

执行用时:57 ms
消耗内存:16.43 MB

参考来源:力扣官方题解

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值