题目
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M) 700 = DCC 由于 500 (D) + 100 (C) + 100 (C) 40 = XL 由于 50 (L) 减 10 (X) 9 = IX 由于 10 (X) 减 1 (I) 注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:
输入:num = 58
输出:"LVIII"
解释:
50 = L 8 = VIII
示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M 900 = CM 90 = XC 4 = IV
代码1
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
a,b,c,d= num//1000, num%1000//100, num%100//10, num%10
ge = ['','I','II','III','IV','V','VI','VII','VIII','IX']
shi = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC']
bai = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM']
qian =['','M','MM','MMM']
str = ''
str +=qian[a]+bai[b]+shi[c]+ge[d]
return str
代码2
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
str=''
flag=0
while num>0:
if num//1000:
s1=num//1000
str+=s1*'M'
num-=s1*1000
elif num//100:
s3=num//100
if s3==9:
str+='CM'
num-=900
elif s3==4:
str+='CD'
num-=400
elif s3>5:
str+='D'
num-=500
str+=(s3-5)*'C'
num-=(s3-5)*100
elif s3<5:
str+=s3*'C'
num-=s3*100
elif num//10:
s5=num//10
if s5==9:
str+='XC'
num-=90
elif s5==4:
str+='XL'
num-=40
elif s5>5:
str+='L'
num-=50
str+=(s5-5)*'X'
num-=(s5-5)*10
elif s5<5:
str+=s5*'X'
num-=s5*10
elif num//1:
s7=num//1
if s7==9:
str+='IX'
num-=9
elif s7==4:
str+='IV'
num-=4
elif s7>5:
str+='V'
num-=5
str+=(s7-5)*'I'
num-=(s7-5)*1
elif s7<5:
str+=s7*'I'
num-=s7*1
return str
总结
代码1简洁,运行时间短,而代码2运行时间较长不是最优解。