题目:https://leetcode-cn.com/problems/integer-to-roman/
题目很好理解,并且容易想到解法。题目要求输入范围是1-3999
可以理解为 在每一位上找到相应的罗马数字表示即可
比如1954:
在1000上找到对应的罗马数字 ‘M’
然后去掉1那一位:在900上找到对应的罗马数字 ’CM‘
然后去掉9那一位:在50上找到对应的罗马数字 ’L‘
然后去掉5那一位: 在4上找到对应的罗马数字 ‘IV’
这样就可以得到1994对应的罗马数字为 ’MCMLIV‘
将每一位的所有可能列成一个列表 也不多
比较容易想的一个解法(暴力匹配)
// An highlighted block
Q = ['','M','MM','MMM']
# 1000,2000,3000
B = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM']
# 100-900
S = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC']
# 10-90
G = ['','I','II','III','IV','V','VI','VII','VIII','IX']
# 1-9
然后傻瓜式取值拼接:
// An highlighted block
num = 1994
temp = num
qw = num//1000 # 算出千位的值
num = num%1000 # 除掉千位数
bw = num//100 # 算出百位的值
num = num%100 # 除掉百位数
sw = num//10 # 算出十位的值
gw = num%10 # 算个位的值
res = Q[qw ] + B[bw ] + S[sw ] + G[gw ] # 得出结论
print(res)
上面的列表设置的时候都将第0个位置设置为空
因为~~~ 假如遇到900这样的数 ,取千位值的时候 qw=900//1000=0
如果列表第一个数 0位没有设置为空,这时候Q[qw]取0位变成M了,应该为空才对 .所以前面的列表第0位都设置为空.
哈希表:
在网上学了一个解法~~~~
将所有的组成类型放到哈希表里,匹配哈希表统计次数即可.
比如3425 :
匹配3次的1000 ,1次的400, 2次的100 ,一次的5
// An highlighted block
num = 3425
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 # 降位
print(res)
# 结果输出 MMMCDXXV