12. 整数转罗马数字
https://leetcode-cn.com/problems/integer-to-roman/
解法一:套规则
思路:特别蠢
罗马数字特点是“左减右加” (https://zhidao.baidu.com/question/13702383) 先将num的个十百千位取出来,然后从高到低逐位判断并输出即可。
class Solution:
def intToRoman(self, num: int) -> str:
res = ""
#获取各位
ones = num % 10
tens = (num // 10) % 10
hundreds = (num // 100) % 10
thousands = (num // 1000) % 10
for _ in range(thousands): #处理千位
res += "M"
#处理百位
if hundreds == 4:
res += "CD"
elif hundreds == 9:
res += "CM"
elif hundreds > 4 and hundreds < 9:
res += "D"
for _ in range(hundreds - 5):
res += "C"
elif hundreds > 0 and hundreds < 4:
for _ in range(hundreds):
res += "C"
#处理十位
if tens == 4:
res += "XL"
elif tens == 9:
res += "XC"
elif tens > 4 and tens < 9:
res += "L"
for _ in range(tens - 5):
res += "X"
elif tens > 0 and tens < 4:
for _ in range(tens):
res += "X"
#处理个位
if ones == 4:
res += "IV"
elif ones == 9:
res += "IX"
elif ones > 4 and ones < 9:
res += "V"
for _ in range(ones - 5):
res += "I"
elif ones > 0 and ones < 4:
for _ in range(ones):
res += "I"
return res
解法二:映射
实际上跟解法一差不多,求出各数位的数字,然后映射到表里即可。
class Solution:
def intToRoman(self, num: int) -> str:
romans = [
['', 'M', 'MM', 'MMM'], #千位
['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'], #百位
['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'], #十位
['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'] #个位
]
return romans[0][num // 1000] + romans[1][num%1000 // 100]\
+ romans[2][num%100 // 10] + romans[3][num%10]
解法三:
只考虑右加,不考虑左减,将10,9,5,4,1这些数从大到小都列入values,对应表示列入reps。
遍历values,遇到比num小的数就自减,并从左到右输出表示,直到num=0
class Solution:
def intToRoman(self, num: int) -> str:
values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
reps = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
res = ''
for i in range(len(values)):
while num >= values[i]:
num -= values[i]
res += reps[i]
return res
更简略的写法,数值和表示作为二元组写在一个表里:
class Solution:
def intToRoman(self, num: int) -> str:
res = ''
token = [(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 value, rep in token:
while num >= value:
num -= value
res += rep
return res
最后更新于