一、题目描述(罗马数字转为数字)
https://leetcode.com/problems/roman-to-integer/description/
二、题目分析Roman numerals are represented by seven different symbols:
I
,V
,X
,L
,C
,D
andM
.Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000For example, two is written as
II
in Roman numeral, just two one's added together. Twelve is written as,XII
, which is simplyX
+II
. The number twenty seven is written asXXVII
, which isXX
+V
+II
.Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not
IIII
. Instead, the number four is written asIV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written asIX
. There are six instances where subtraction is used:
I
can be placed beforeV
(5) andX
(10) to make 4 and 9.X
can be placed beforeL
(50) andC
(100) to make 40 and 90.C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III" Output: 3Example 2:
Input: "IV" Output: 4Example 3:
Input: "IX" Output: 9Example 4:
Input: "LVIII" Output: 58 Explanation: C = 100, L = 50, XXX = 30 and III = 3.Example 5:
Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
发现规律:罗马数字为从大到小排列,若前面的罗马数字小于后面,则此两位相当于减去前面数字再加上后面数字,按照这个规律可解。
注意出错处:
1.由于range函数生成的range是一个范围,它是左闭右开区间,所以循环次数需要注意。
2.循环中有s[i+1]出现,应该保证s[i+1]有意义,所以在for循环中少循环一次,s最后一项的值在循环外加上,即sum+=d[s[-1]]
三、代码实现
class Solution: def romanToInt(self, s): """ :type s: str :rtype: int """ sum=0 d = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} for i in range(len(s)-1): temp=d[s[i]] if d[s[i]]<d[s[i+1]]: temp=-d[s[i]] sum+=temp sum+=d[s[-1]] return sum