罗马数字包含以下七种字符: I , V , X , L , C , D 和 M I, V, X, L,C,D 和 M I,V,X,L,C,D和M。
例如, 罗马数字 2 2 2 写做 I I II II ,即为两个并列的 1 1 1。 12 12 12 写做 X I I XII XII ,即为 X + I I X + II X+II 。 $27 $写做 X X V I I XXVII XXVII, 即为 X X + V + I I XX + V + II XX+V+II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 4 4 不写做 I I I I IIII IIII,而是 I V IV IV。数字 1 1 1 在数字 5 5 5 的左边,所表示的数等于大数 5 5 5 减小数 1 1 1 得到的数值 4 4 4 。同样地,数字 9 9 9 表示为 I X IX IX。这个特殊的规则只适用于以下六种情况:
I I I 可以放在 V ( 5 ) V (5) V(5) 和 X ( 10 ) X (10) X(10) 的左边,来表示 4 4 4 和 9 9 9。
X X X 可以放在 L ( 50 ) L (50) L(50) 和 C ( 100 ) C (100) C(100) 的左边,来表示 40 40 40 和 90 90 90。
C C C 可以放在 D ( 500 ) D (500) D(500) 和 M ( 1000 ) M (1000) M(1000) 的左边,来表示 400 400 400 和 900 900 900。
给你一个整数,将其转为罗马数字。
思路大概就是除以10,挨个将每个位上的数字表示出来。比如 1984 1984 1984分为 1000 1000 1000、 900 900 900、 80 80 80和 4 4 4。
class Solution:
def intToRoman(self, num: int) -> str:
dict = {'IV': 4, 'V': 5, 'IX': 9, 'XL': 40, 'L': 50, 'XC': 90, 'CD': 400, 'D': 500, 'CM': 900, 'M': 1000}
nums = str(num)
l = []
for i in range(len(nums)):
a = (num % 10) * 10**i
if a in [1, 2, 3]:
# Python 会将 a 转换为整型,然后再进行整数除法运算。
l.append('I' * a)
elif a in [6, 7, 8]:
b = a - 5
l.append('V' + 'I' * b)
elif a in [10, 20, 30]:
l.append('X' * (a // 10))
elif a in [60, 70, 80]:
b = a - 50
l.append('L' + 'X' * (b // 10))
elif a in [100, 200, 300]:
l.append('C' * (a // 100))
elif a in [600, 700, 800]:
b = a - 500
l.append('D' + 'C' * (b // 100))
elif a in [1000, 2000, 3000]:
l.append('M' * (a // 1000))
else:
# 这里的 d.items() 方法返回一个可迭代的键值对对象,对于每个键值对 (k, v),如果值 v 等于目标值 target,则返回对应的键 k。
for k, v in dict.items():
if v == a:
l.append(k)
break
num = num // 10
output = ''
while l:
output += l.pop()
return output
这个思路相对比较简单,因为题目中说输入在 1 3999 1 ~3999 1 3999 的范围内,所以我们把 1 到 9 , 10 到 90 , 100 到 900 , 1000 到 3000 1 到 9,10 到 90,100 到 900,1000 到 3000 1到9,10到90,100到900,1000到3000 对应的罗马数字都表示出来,最后对于任何输入,我们要做的就是把找到的罗马数字组合起来即可。
比如输入是 2359 2359 2359,我们找到 2000 , 300 , 50 , 9 2000,300,50,9 2000,300,50,9 对应的罗马数字为 M M , C C C , L , I X , MM,CCC,L,IX, MM,CCC,L,IX,组合后得到结果为 M M C C C L I X 。 MMCCCLIX。 MMCCCLIX。
class Solution:
def intToRoman(self, num: int) -> str:
M = ["", "M", "MM", "MMM"] # 1000,2000,3000
C = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"] # 100~900
X = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"] # 10~90
I = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"] # 1~9
return M[num//1000] + C[(num%1000)//100] + X[(num%100)//10] + I[num%10]
在以前还使用现金购物的时候,找零钱的时候一般商家会尽量选择面值大的纸币(硬币)给顾客,这样才会使得给顾客的纸币(硬币)张数最少,让顾客点钱的时候更方便。
贪心法则:尽量使用最大的数来表示,以使表达的数字个数最少。比如对于 1994 这个数,如果我们每次尽量用最大的数来表示,依次选 1000 , 900 , 90 , 4 1000,900,90,4 1000,900,90,4 会得到正确结果 M C M X C I V 。 MCMXCIV。 MCMXCIV。
所以,我们将哈希表按照从大到小的顺序排列,然后遍历哈希表,直到表示完整个输入。
class Solution:
def intToRoman(self, num: int) -> str:
dict = {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'}
s = ''
# 遍历字典的键值
for key in dict:
if num // key != 0:
a = num // key
s += a * dict[key]
num %= key
return s