2022-04-13 罗马数字转整数

T13 罗马数字转整数

在这里插入图片描述

解法一 :

1.根据题目所给的六种情况构建字典
2. 将每种情况取出,构建数组,从大到小排列,方便后面遍历
3.遍历arr_dict 数组,若字符串中包含该元素,则count加上字典中该键的值,然后从字符串中删除该子串,(这里不需要计算子串出现的次数,因为除了题目上说除了那六种情况,其余都是左边大 右边小,所以,同一个特殊字串不可能出现两次)
4. 对剩下的字符进行遍历,累加则为最终结果。

class Solution:
    def romanToInt(self, s: str) -> int:
        count = 0
        dict_ = {"IV":4,"IX":9,"XL":40,"XC":90,"CD":400,"CM":900}
        arr_dict = ["CM","CD","XC","XL","IX","IV"]
        for i in arr_dict:
            if i in s:
                count += dict_[i] 
                print(count)
                s = s.replace(i,"")
        for i in s:
            if i == 'I':
                count += 1
            elif  i == 'V':
                count += 5
            elif  i == 'X':
                count += 10
            elif  i == 'L':
                count += 50
            elif  i == 'C':
                count += 100
            elif  i == 'D':
                count += 500
            elif  i == 'M':
                count += 1000
        return count

解法二 :

1.构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值)
2.这样一来,遍历整个 s的时候判断当前位置和前一个位置的两个字符组成的字符串是否在字典内,如果在就记录值,不在就说明当前位置不存在小数字在前面的情况,直接记录当前位置字符对应值

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
        return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))

解法三(哈希) :

1.通过观察我们发现,只有在遇到特殊情况时,两个字符中左边的字符小于右边的字符,且等于右边的字符代表的数减左边字符代表的数。 比如 CM 等于 1000 - 100 ,XC 等于 100 - 10 …
因此,我们将 字符:数值 存在 Roman2Int 的哈希表中。然后从左到右遍历每个字符,如果 s[i] < s[i+1],就将结果减去 s[i] 代表的数字;否则,将结果加上 s[i] 代表的数字。

class Solution:
    def romanToInt(self, s: str) -> int:
        dict_= {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        count= 0
        n = len(s)

        for index in range(n - 1):
            if dict_[s[index]] < dict_[s[index + 1]]:
                count -= dict_[s[index]]
            else:
                count += dict_[s[index]]

        return count + dict_[s[-1]]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值