12. Integer to Roman
2017-10-26 本文已影响5人
ciantian
最近再刷leetcode,除了链表之外的都用python 实现,贴出一些代码,希望指正.
问题描述:
整数转罗马数字
在没做这个题之前我想大家应该对罗马数字都没什么了解吧.
I = 1;
V = 5;
X = 10;
L = 50;
C = 100;
D = 500;
M = 1000;
其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C。
解题思想
题中又说最大的是3999,那么对问题就有了很大的简化.
最大的是4位数,那最简单的方案就是用四个list分别表示每个单位对应的值,然后用长度遍历即可.
每个list的第一位是补位为了好计算,无意义.
个位1--9 list1 = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
十位10--90 list2 = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
百位100--900 list3 = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
千位1000--3000 list4 = ["", "M", "MM", "MMM"]
代码实现
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
# 个位 十位 百位 千位
list1 = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
list2 = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
list3 = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
list4 = ["", "M", "MM", "MMM"]
list_all = [list1, list2, list3, list4]
length = len(str(num))
if num == 0:
return " "
list_5 = []
for i in range(length):
tmp = num // pow(10, (length - 1 - i))
num = num % pow(10, (length - 1 - i))
list_5.append(list_all[length -1 - i][tmp])
return ''.join(list_5)
solution = Solution()
print(solution.intToRoman(3999))