标签
哈希表;数组;字符串
难度
简单
解题思路
根据规则:
罗马数字中小的数字在大的数字的右边,而特殊规则中,小的数字在大的数字左边
特殊规则出现的情况仅包括相差结果为4,9,40,90,400,900这六种情况。
故将输入的罗马数字分块。例如:MCMXCIV 则可以切分成M CM XC IV
以此对比数据,即为1000,900,90,4 相加即得结果__
class Solution:
def romanToInt(self, s):
Result = [] # 存储分块读取的结果
count = 0 # 计数,用于判断分块区域
ln = len(s)
s = s[::-1] # 将罗马数字翻转
Rule = [4,9,40,90,400,900] # 特殊规则情况
Keys = {'I': 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
for i in range(ln):
# 分块区域的判断,跳过符合“特殊规则”的数字,即“分块”
if count % 2 == 1:
count = count+1
continue
# 确保不越界的情况下判断翻转之后罗马数字的前一位是否大于后一位
if i < ln - 1 and Keys[s[i]] > Keys[s[i + 1]]:
su = Keys[s[i]] - Keys[s[i + 1]] # 保存结果
if su in Rule: # 结果是否符合“特殊规则”
Result.append(su)
count = count + 1 # 符合规则则将其绑定,后一位数字不再参与计算
else:
return # 输入不符合罗马数字使用规则
else:
Result.append(Keys[s[i]]) # 正常规则内数字,直接存储
return sum(Result) #计算存出结果列表中的和
if __name__ == "__main__":
so = Solution()
l = so.romanToInt("IL")
print(l)