天天看点

力扣(leetcode) 12. 整数转罗马数字 (哈希映射表解法)、(暴力匹配)

题目: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位都设置为空.

哈希表:

在网上学了一个解法~~~~

将所有的组成类型放到哈希表里,匹配哈希表统计次数即可.

// 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