罗马数字_ 转整数13

题目:

 

 

代码一:

思路:

1)先找到字符串中的大的子串,统计个数 * 对应的数值 -> 加入求和list,找到后用“”空字符替换,

2)再对更小的子串,进行搜索?,最后统计和 sum

class Solution:
    def romanToInt(self, s: str) -> int:
        roman_dict = {"I": 1,
                  "V": 5,
                  "X": 10,
                  "L": 50,
                  "C": 100,
                  "D": 500,
                  "M": 1000,
                  }
        two_roman_dict = {
                      "IV": 4,
                      "IX": 9,
                      "XL": 40,
                      "XC": 90,
                      "CD": 400,
                      "CM": 900
                      }

        add_item = []

        def get_sum(k, v, s):
            if k in s:
                how_many = s.count(k)
                s = s.replace(k, "")
                if how_many > 1:
                    add_item.append(v*how_many)
                else:
                    add_item.append(v)
            return add_item, s

        # 先替换长的子串,然后加入list, 统计一下出现的次数
        for k, v in two_roman_dict.items():
            add_item, s = get_sum(k, v, s)

        # 短子串
        for m, n in roman_dict.items():
            add_item, s = get_sum(m, n, s)

        return sum(add_item)
第一个程序运行时间: 3.886222839355469e-05
结果: 58

 

 

代码二:

思路更牛逼一些:

1)因为都是大的数字在前面,所以利用,如果出现前面数字大于后面的,则它是组合,注意,需要减去中间的那个重复的

2)举例:“MCMXCIV“  -->  注意 加法顺序,先看前面三个字母之和


如果啥不操作,无脑叠加结果是:M + C + M = 2M + C

实际上我们想得到的是: M + (M -C)

所以程序中,我们需要在无脑的结果上  减去2倍的中间值C,才能得到正确结果

M + C + M - 2C  --> OK?

 

class Solution:
    def romanToInt(self, s: str) -> int:

        roman_dict = {"I": 1,
                      "V": 5,
                      "X": 10,
                      "L": 50,
                      "C": 100,
                      "D": 500,
                      "M": 1000,
                      }
        result = 0
        for i in range(len(s)):

            if i > 0 and roman_dict[s[i]] > roman_dict[s[i-1]]:
                result += roman_dict[s[i]] - 2*roman_dict[s[i-1]]
            else:
                result += roman_dict[s[i]]

        return result

结论:

 

IDE 结果:

第一个程序运行时间: 2.193450927734375e-05
结果: 1994
第二个程序运行时间: 1.0967254638671875e-05
结果: 1994

 

 

总结,多种角度思考问题,加油!⛽️!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值