LeetCode12.整数转罗马数字

举报
Python新视野 发表于 2021/09/09 23:53:57 2021/09/09
【摘要】 题目来源:力扣(LeetCode) 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V ...

题目来源:力扣(LeetCode)


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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

例如, 罗马数字 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"

  
 
  • 1
  • 2

示例2:

输入: 4
输出: "IV"

  
 
  • 1
  • 2

示例3:

输入: 9
输出: "IX"

  
 
  • 1
  • 2

示例4:

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

  
 
  • 1
  • 2
  • 3

示例5:

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

  
 
  • 1
  • 2
  • 3

提示:

  • 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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

文章来源: blog.csdn.net,作者:Dream丶Killer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43965708/article/details/116714193

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。