罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
输入: 3
输出: "III"
输入: 4
输出: "IV"
分析:
罗马转数字,键值对关系为{罗马:数字}。数字转罗马,键值对关系为{数字:罗马}。
首先定义一个映射关系,使得从1到1000且包括6种特殊数字的共13个基本数字对应其罗马数字。接着从大到小遍历各数字,对于每个数字若其不大于num,则在结果中放置其对应的罗马数字,并将num减去该数字,然后继续与该数字比较。若其大于num,则再继续向前比较直到num减为0。
class Solution(object):
def intToRoman(self, num):
"""
:type num: int
:rtype: str
"""
res = ""
# map需要按顺序从小到大排
hash_map = {1:'I',4:'IV',5:'V',9:'IX',10:'X',40:'XL',50:'L',90:'XC',100:'C',400:'CD',500:'D',900:'CM',1000:'M'}
nums = [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]
idx = 12
while num:
if num >= nums[idx]:
res += hash_map[nums[idx]]
num -= nums[idx]
else:
idx -= 1
return res
罗马转数字的代码,复习一下
class Solution:
# @param {string} s
# @return {integer}
def romanToInt(self, s):
roman = {'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
z = 0
for i in range(0, len(s) - 1):
if roman[s[i]] < roman[s[i+1]]:
z -= roman[s[i]]
else:
z += roman[s[i]]
return z + roman[s[-1]]
*Note: The trick is that the last letter is always added. Except the last one, if one letter is less than its latter one, this letter is subtracted.
参考:
LeetCode 12. 整数转罗马数字(Integer to Roman)