话不多说,直接上题目:
class Solution(object):
def romanToInt(self, s):
l = list(s)
print(l)
num = 0
biaozhiwei = False
for i in range(len(s)):
if biaozhiwei:
biaozhiwei = False
continue
if l[i] == 'I':
if i+1 < len(s) and l[i+1] == 'V':
num = num + 4
biaozhiwei = True
elif i+1 < len(s) and l[i+1] == 'X':
num = num + 9
biaozhiwei = True
else:
num = num + 1
if l[i] == 'X':
if i+1 < len(s) and l[i+1] == 'L':
num = num + 40
biaozhiwei = True
elif i+1 < len(s) and l[i+1] == 'C':
num = num + 90
biaozhiwei = True
else:
num = num + 10
if l[i] == 'C':
if i+1 < len(s) and l[i+1] == 'D':
num = num + 400
biaozhiwei = True
elif i+1 < len(s) and l[i+1] == 'M':
num = num + 900
biaozhiwei = True
else:
num = num + 100
if l[i] == 'V':
num = num + 5
if l[i] == 'L':
num = num + 50
if l[i] == 'D':
num = num + 500
if l[i] == 'M':
num = num + 1000
return num
通过不停的判断每一位,加相应的值,如果是I,X,C则需要判断后续字母,如果后续字母是特殊字符,则需要加相应的值,而且在下次循环的时候,需要跳过。
这种方式太麻烦了,需要做很多的判断,还要做特殊处理,不是一个好的选择,通过观察数字的特殊规则,可以发现一个规律,如果后续字母所代表的数字,大于当前字母,则当前位和后续位合起来表示的数字,正好是后续字母代表的数字,减去当前数字,这样代码就能够简洁一些了:
class Solution(object):
def romanToInt(self, s):
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
num = 0
for i in range(len(s)):
if i < len(s)-1 and a[s[i]]<a[s[i+1]]:
num = num - a[s[i]]
else:
num = num + a[s[i]]
return num
通过一次判断,就能概括所有的特殊情况,nice!