13、罗马数字转整数--LeetCode

题目描述:

  • 罗马数字包含以下的七种字符:IVXLCDM
字符				数值
I				1
V				5
X				10
L				50
C				100
D				500
M				1000

例如,罗马数字2写做II,即为两个并列的112写做XII,即为X + II27写做XXVII,即为XX+V+II
通常情况下,罗马数字中小的数字在打的数字的右边。但是也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4.同样的,数字9表示为IX。这个特殊的规则只适用于以下六种情况:

  • I可以放在V(5)X(10)的左边,来表示49
  • X可以放在L(50)C(100)的左边,来表示4090
  • C可以放在D(500)M(1000)的左边,来表示400900

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

示例1:

输入:“III”
输出:3

示例2:

输入:“IV”
输出:4

示例3:

输入:“IX”
输出:9

示例4:

输入:“LVIII”
输出:58
解析:L = 50, V= 5, III = 3.

示例5:

输入:“MCMXCIV”
输出:1994
解析:M = 1000, CM = 900, XC = 90,IV = 4.

算法设计与分析:

  • 这里使用python3就很快。

  • 方法一:罗马数字的符号总的来说就不多,数值的大小全部依靠拼接来组成,总的字符有:I,V,X,L,C,D,M,其中位于段内1~5, 5~10, 10~50, 50~100, 100~500, 500~1000之内的数字都要依靠拼接,当符号I,X,C位于大于它们的数的后面的时候就作为加数,位于前面的时候就作为减数,使用字典可以将它们对应的值列举出来,这样操作字典就可以直接获取到它们对应的值,使用上面的原则就可以得到下面的伪代码:

    • 1、列举出他们对应的字典,并初始化转换的结果result=0
    • 2、对于传入的罗马字符串s,使用(字典、列表、元组)的迭代函数enumerate对字典进行迭代,获取每个字符的索引值(默认从0开始)和字符。
    • 3、初始化参数value,然后根据s对应的字符串查找字典,更新value的值如果到最后的一个值就直接赋值为0
    • 4、判断传入的s罗马字符串是否有下一个,加1和s的长度比较,然后根据获取到的字符再查询字典,并获取到罗马字符对应的值
    • 5、判断下一个值是否比当前值大,如果大于当前值,value就需要取反(取负数)
    • 6、对转换之后的值 逐个添加到result中:左减右加
    • 7、循环迭代,返回第二步,直到取到末尾的值
    • 8、返回结果result
  • 方法二:使用罗马字符的组合的特殊性,除了一些单个字符表示的基础的数字之外,例如IVXLCDM分别表示1,5,10,50,100,500,1000之外,还用一些特殊的组合,例如IV,IX,XL,XC,CD,CM分别表示4,9,40,90,400,900,他们组合起来表示其他的所有的数字,因为其特殊性,不会组合产生歧义(前提是传入的罗马数字是规范的),所以可以使用字符串的处理方法对其中的一些字符串进行处理,将上面的基础的字符和组合的字符使用字典存放起来,并定义一个空列表numlist,然后查询字符串中是否有相应的组合。如果有对应的组合,就查询字典,获取到对应的数值并将这些数值append到numlist中去,最后迭代numlist列表,将里面的数全部加起来就可以得到罗马字符转换的整数,有如下的伪代码:

    • 1、将所有的符号对应的值使用字典存储起来
    • 2、初始化结果的值num和空的列表numlist
    • 3、逐个对传入的罗马字符串中的字符进行替换,并将对应的字符append到列表里面。
    • 4、遍历字符串s,将剩下来的单个没有被转换的字符进行转换,并将字符对应的值append到numlist里面去
    • 5、遍历得到的numlist,将里面的值相加起来就得到最后的结果num
    • 6、返回num,函数结束。
  • 使用python3对方法一进行描述:

class Solution:
    def romanToInt(self, s: str) -> int:
        dic = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500,"M":1000}
        result = 0
        for idx, ch in enumerate(s):
            value = 0
            if dic[ch] is not None:
                value = dic[ch]
            if idx + 1 < len(s):
                nextCh = s[idx + 1]
                nextValue = dic[nextCh]
                if nextValue is not None and nextValue > value:
                    value = value * -1
            result += value
        return result     
  • 使用Python3对方法二进行描述:
class Solution:
    def romanToInt(self, s: str) -> int:
        dict = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000,"IV":4,"IX":9,"XL":40,"XC":90,"CD":400,"CM":900}
        num = 0
        numlist = []
        if "CM" in s:numlist.append(900);s = s.replace("CM","900")
        if "CD" in s:numlist.append(400);s = s.replace("CD","400")
        if "XC" in s:numlist.append(90);s = s.replace("XC","90")
        if "XL" in s:numlist.append(40);s = s.replace("XL","40")
        if "IX" in s:numlist.append(9);s = s.replace("IX","9")
        if "IV" in s:numlist.append(4);s = s.replace("IV","4")
        for i in s:
            # 如果该数对应的在字典里面的时候才加的,否则不加,题目已经给出了范围
            if dict.get("%s"%i):
                numlist.append(dict.get("%s"%i))
        for i in numlist:
            num += i
        return num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值