【力扣笔记】13.罗马数字转整数--解决“跨界”IL不是49问题

标签

哈希表;数组;字符串

难度

简单

解题思路

根据规则:
罗马数字中小的数字在大的数字的右边,而特殊规则中,小的数字在大的数字左边
特殊规则出现的情况仅包括相差结果为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)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值