题目描述:
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 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。
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
示例 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.
看到这道题稍微有点懵,首先想到的是判断几位数,然后再去一一判断(会有一堆if else),最后否定了自己感觉这样太麻烦,就去参考了别人的想法,感觉他们的好简单呀!!!!!!(启发:以后脑海里如果出现很多if else 的时候不妨试试匹配关系)
方法一:直接用数组去匹配各个位上的值,不足之处超过四千的时候要重新定义数组M,超过千位的时候要再添加万位的数组
class Solution:
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
M = ['','M','MM','MMM']
C = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM']
X = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC']
I = ['','I','II','III','IV','V','VI','VII','VIII','IX']
return M[num // 1000] + C[(num % 1000) // 100] + X[(num % 100) // 10] + I[num % 10]
方法二:把匹配关系用元祖的列表表示,从大到小排列,让给定的数与之匹配,同时减去已匹配过的部分。同样处理大于3999的数时需要添加新的匹配关系。
class Solution:
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
result = ''
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')]
for one_tuple in d:
while num >= one_tuple[0]:
result += one_tuple[1]
num -= one_tuple[0]
return result