解题思路
- 设置list列表
- num数值最大为3999,从千位开始转,将对应数字的罗马数字加入列表list
- 最后将list转成str
代码
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
ans = []
a = num / 1000
for i in range(a):
ans.append("M")
b = (num - (num / 1000) * 1000) / 100
if b == 4:
ans.append("CD")
elif b == 9:
ans.append("CM")
elif b >= 5 and b < 9:
ans.append("D")
for i in range(b-5):
ans.append("C")
elif b < 4:
for i in range(b):
ans.append("C")
c = (num - a * 1000 - b * 100) / 10
if c == 4:
ans.append("XL")
elif c == 9:
ans.append("XC")
elif c >= 5 and c < 9:
ans.append("L")
for i in range(c-5):
ans.append("X")
elif c < 4:
for i in range(c):
ans.append("X")
d = num % 10
if d == 4:
ans.append("IV")
elif d == 9:
ans.append("IX")
elif d >=5 and d < 9:
ans.append("V")
for i in range(d-5):
ans.append("I")
elif d < 4:
for i in range(d):
ans.append("I")
return "".join(ans)
贪心算法:
将特殊情况以及所有的字符加入哈希表,遍历哈希表
class Solution:
def intToRoman(self, num: int) -> str:
# 使用哈希表,按照从大到小顺序排列
hashmap = {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'}
res = ''
for key in hashmap:
if num // key != 0:
count = num // key # 比如输入4000,count 为 4
res += hashmap[key] * count
num %= key
return res
作者:z1m
链接:https://leetcode.cn/problems/integer-to-roman/solution/tan-xin-ha-xi-biao-tu-jie-by-ml-zimingmeng/
上面的代码运行时我遇到了问题,查看评论区,字典有序是python3.5以后新加的功能。可以利用两个list实现有序。代码如下
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
list1=[1000,900,500,400,100,90,50,40,10,9,5,4,1]
list2=['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']
res = ''
for i in range(len(list1)):
while num >= list1[i]:
res += list2[i]
num -= list1[i]
return res