13.Roman to Integer

题目(罗马数字转成数字)

1
2
3
Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999

题目解析

罗马数字拼写规则

罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)

  • 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
  • 右加左减:
    • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
    • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
    • 左减数字必须为一位,比如8写成VIII,而非IIX。
    • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(不必实现也可通过)
    • 左减时不可跨越一个位值。比如,99不可以用IC( {\displaystyle 100-1} 100-1)表示,而是用XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(不必实现)

解题思路

本题相对简单并非完全遵循罗马的拼写规则,只比较当前元素与后一个元素的关系,若后一个元素大于前一个元素,且满足后一个元素减前一个元素的条件,则当前元素设为负

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
table = {
'I':1,
'V':5,
'X':10,
'L':50,
'C':100,
'D':500,
'M':1000
}
table_left = ('I','X','C')
base = 0
for i in range(len(s)-1):

if s[i] in table_left:
if table[s[i+1]]>table[s[i]]:
base = base - table[s[i]]
else:
base = base + table[s[i]]
else:
base = base + table[s[i]]
base = base + table[s[-1]]
return base

本文标题:13.Roman to Integer

文章作者:定。

发布时间:2017年7月9日 - 21时07分

本文字数:1,179字

原始链接:http://cocofe.cn/2017/07/09/Roman to Integer/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。