【LeetCode】13. Roman to Integer 解题报告(Python)

127 篇文章 2 订阅
102 篇文章 2 订阅

题目翻译:

罗马数字由七个不同的符号表示:I,V,X,L,C,D和M.

符号值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,两个用罗马数字写成II,只有两个加在一起。十二写为XII,简称为X + II。第二十七号写成XXVII,即XX + V + II。

罗马数字通常从左到右从最大到最小。但是,四个数字不是IIII。相反,第四个写为IV。因为一个在五个之前,我们减去四个。同样的原则适用于九号,即九号。有六个使用减法的实例:

I可以放在V(5)和X(10)之前做4和9。
X可以放在L(50)和C(100)之前,以产生40和90。
C可以放在D(500)和M(1000)之前,以产生400和900。
给定一个整数,将其转换为罗马数字。输入保证在1到3999的范围内。

题目分析:

这个题目是将罗马数字转换成数字输出,与12题故相似也有两种方法。

代码说明:

1、倒序版中用last保存上一个数不要要预读。

2、如果下一个数小于上一个数,那么减两次较小的,然后再加一次小的,这个实现比较巧妙简洁。

for i in range(len(num_list)):
            while num >= num_list[i]:
测试代码:

使用字典一一对应,只需注意高位字符一定大于低位字符即可,如果高位小于低位则减掉两个低位字符(后面会再加上一个)。代码中倒序了字符串更好判断,也可不倒序。

倒序版:

class Solution:
    # @return an integer
    def romanToInt(self, s):
        numerals = { "M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1 }
        sum=0
        s=s[::-1]
        last=None
        for x in s:
            if last and numerals[x]<last:
                sum-=2*numerals[x]
            sum+=numerals[x]
            last=numerals[x]
        return sum

print(Solution().romanToInt('MCMXCIV'))  #提交时请删除该行

不倒序版(每次要多预读一个字符):

class Solution:
    # @return an integer
    def romanToInt(self, s):
        num = 0
        roman_num = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
        for i in range(len(s)):
            if i < len(s) - 1 and roman_num[s[i]] < roman_num[s[i+1]]:
                num -= 2*roman_num[s[i]]
            num += roman_num[s[i]]
        return num

print(Solution().romanToInt('LVIII'))  #提交时请删除该行

也可使用判断再对应的方法:

class Solution:
    def romanToInt(self, s):
        num = 0
        i = 0
        while(i < len(s)):
            if i < len(s) - 1 and s[i] == 'C' and s[i+1] == 'D':
                num += 400
                i += 2
            elif i < len(s) - 1 and s[i] == 'C' and s[i+1] == 'M':
                num += 900
                i +=2
            elif i < len(s) - 1 and s[i] == 'X' and s[i+1] == 'L':
                num += 40
                i += 2
            elif i < len(s) - 1 and s[i] == 'X' and s[i+1] == 'C':
                num += 90
                i += 2
            elif i < len(s) - 1 and s[i] == 'I' and s[i+1] == 'V':
                num += 4
                i += 2
            elif i < len(s) - 1 and s[i] == 'I' and s[i+1] == 'X':
                num += 9
                i += 2
            elif s[i] == 'M':
                num += 1000
                i +=1
            elif s[i] == 'D':
                num += 500
                i +=1
            elif s[i] == 'C':
                num += 100
                i +=1
            elif s[i] == 'L':
                num += 50
                i +=1
            elif s[i] == 'X':
                num += 10
                i +=1
            elif s[i] == 'V':
                num += 5
                i +=1
            elif s[i] == 'I':
                num += 1
                i +=1
        return num
print(Solution().romanToInt('MCMXCIV'))  #提交时请删除该行

参考博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值