LeetCode(python3) #13 罗马数字转整数

#13 罗马数字转整数题解

一.解题思路

思路:这题本人做法比较常规,略有些偷懒。将非重复的组合先列好在字典中,然后循环判断字典中的key是否出现在字符串中,若出现则累加数值,之后将字符串中的对应key删除

参考:这里我也参考了别人不错(不偷懒)的做法,就是按照题目规则:将字符串里前一位与后一位字符比大小,若前一位小于后一位那么则减前一位,反之则加前一位。

二.代码展示

# 自己的解法
class Solution:
    def romanToInt(self, s):
        # 记录累加值
        res = 0
        # 规则字典
        rule = {'CM': 900, 'CD': 400, 'XC': 90, 'XL': 40, 'IX': 9, 'IV': 4, 'M': 1000,
                'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}

        # 循环整个字典
        for key, value in rule.items():
            # 如果字典中的key在字符串s中有出现则进入
            if key in s:
                # 统计字典中的key在字符串中出现的次数。例如:III 是 1*3=3
                key_count = s.count(key)
                # 计算累加值
                res += (value * key_count)
                # 字符串替换,将计算过的符号替换为空字符串
                s = s.replace(key, '', key_count)
                # 如果字符串s为空字符串后说明计算完成
                if s == '':
                    break
        return res
# 这是参考别人的解法
class Solution:
    def romanToInt2(self, s):
        # 记录累加值
        res = 0
        # 规则字典
        rule = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        # 记录字符串长度
        s_len = len(s)
        # 循环字符串长度减1次(因为需要判断字符串前一位与后一位字符对应规则字典的大小关系,不减1的话最后一位字符是没有下一位的)
        for index in range(s_len - 1):
            # 判断第一位字符是否小于第二位(按照规则如果前一位字符比后一位字符小则减前一位,否则加前一位)
            if rule[s[index]] < rule[s[index+1]]:
                res -= rule[s[index]]
            else:
                res += rule[s[index]]
        # 最后返回累加值时需要注意,把字符串最后一位加上
        return res + rule[s[-1]]

三.总结其他

总结:这题我认为我参考的那位兄弟的解法很优雅,因为很符合题目要求,也不用在字典里放入其他额外的组合之类的。自己写的那个在我看来算是偷懒吧,直接把可能的组合放入字典了,感觉挺多余的。

期望:好好学习优秀的源码,提升自己,让自己也能写出优雅的代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值