leetcode-13 罗马数字转换为整数 python3

该博客介绍如何将罗马数字转换为整数,解释了罗马数字的字符及其对应数值,包括特殊情况如IV和IX的表示。通过字典存储数值,识别字母并判断加减法来解决转换问题。示例代码和逻辑分析帮助理解转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

罗马数字包含以下七种字符:I, V, X, L, C, D和M。

字符        数值

I              1

V             5

X             10

L              50

C             100

D             500

M            1000

例如,罗马数字2写做II,即为两个并列的1。12写作XII,即为X + II。27写作XXVII,即为XX+V+II。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在V(5)和X(10)的左边,来表示4和9。
  • X可以放在L(50)和C(100)的左边,来表示40和90。
  • C可以放在D(500)和M(1000)的左边,来表示400和900。

给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。

示例1

输入:“III”

输出:3

示例2

输入:“IV”

输出:4

看完这个题目,首先就是想到先用字典存以下I到M的数值,方便之后索引。然后I,X,C是三种特殊的情况(比如VI是5+1=6,做加法;IV是5-1=4,做减法)。所以,在一个个识别字母的时候只需要考虑和前面一个字母是做加法还是做减法即可。因为题目没有说让判断输入的字符串是不是罗马数字,所以假定输入的都是符合规则的(即不会出现诸如D在M左边这样的情况):

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
         r_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        num = r_dict[s[0]]
        sum = 0
        if len(s) == 1:
            print(num)
        else:
            for i in s[1:]:
                if r_dict[i] <= num:
                    sum += num
                else:
                    sum -= num
                num = r_dict[i]
            sum += num
        return(sum)

当然,也可以利用最原始的办法来做,就是一个一个的判断情况:

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        
        i = 0
        num = 0
        while i<len(s):
            if s[i] == 'M':
                num += 1000
                i += 1
            elif s[i] == 'D':
                num += 500
                i += 1
            elif s[i] == 'C':
                if (i+1) < len(s) and s[i+1] == 'M':
                    num += 900
                    i += 2
                elif (i+1) < len(s) and s[i+1] == 'D':
                    num += 400
                    i += 2
                else:
                    num += 100
                    i += 1
            elif s[i] == 'L':
                num += 50
                i += 1
            elif s[i] == 'X':
                if (i+1) < len(s) and s[i+1] == 'C':
                    num += 90
                    i += 2
                elif (i+1) < len(s) and s[i+1] == 'L':
                    num += 40
                    i += 2
                else:
                    num += 10
                    i += 1
            elif s[i] == 'V':
                num += 5
                i += 1
            elif s[i] == 'I':
                if (i+1) < len(s) and s[i+1] == 'X':
                    num += 9
                    i += 2
                elif (i+1) < len(s) and s[i+1] == 'X':
                    num += 9
                    i += 2
                elif (i+1) < len(s) and s[i+1] == 'V':
                    num += 4
                    i += 2
                else:
                    num += 1
                    i += 1
        return(num)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值