LeetCode12.整数转罗马数字

Posted Dream丶Killer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode12.整数转罗马数字相关的知识,希望对你有一定的参考价值。

题目来源:力扣(LeetCode)


题目描述:
罗马数字包含以下七种字符: IVXLCDM

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

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

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

I 可以放在 V (5)X (10) 的左边,来表示 49
X 可以放在 L (50)C (100) 的左边,来表示 4090
C 可以放在 D (500)M (1000) 的左边,来表示 400900
给定一个整数,将其转为罗马数字。输入确保在 13999 的范围内。


示例1:

输入: 3
输出: "III"

示例2:

输入: 4
输出: "IV"

示例3:

输入: 9
输出: "IX"

示例4:

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

示例5:

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

提示:

  • 1 <= num <= 3999

解题思路:
贪心算法:
在转换的过程中,尽可能优先使用较大数值对应的字符,最后转换得到的罗马数字的字符个数更少。首先定义一个罗马数字与阿拉伯数字的映射列表。列表中的排序按照阿拉伯数字从大到小,循环这个列表中的映射组,用尽可能大的字符去替换。

class Solution(object):
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        # 定义映射列表
        mapping_list = [['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100],
         ['XC', 90], ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1]]
        rst = ''
        for Roman_num, value in mapping_list:
        	# 退出条件
            if num == 0:
                break
            # 将该字符 * 它的个数并添加到rst中
            rst += Roman_num * (num // value)
            # 获取剩余的num
            num %= value
        return rst

在这里插入图片描述

以上是关于LeetCode12.整数转罗马数字的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode12. 整数转罗马数字(贪心)

LeetCode 12 - 整数转罗马数字 - [简单模拟]

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字