LeetCode 罗马数字转整数

题目:

罗马数字包含以下七种字符:I, V, X, LCD 和 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

示例 3:

输入: "IX"
输出: 9

示例 4:

输入: "LVIII"
输出: 58
解释: C = 100, L = 50, XXX = 30, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:

因为罗马数字转阿拉伯数字的难点就在于特殊情况(IVIX, XLXCCDCM)的处理,考虑将输入的罗马数字两两分为一组,依次转换为对应的阿拉伯数字。

在主函数部分,遍历罗马数字的每一位,取当前位和下一位组成新的罗马数字传入辅助函数twochar中,得到对应的整数值和判断结果(key),key用于控制罗马数字当前位的下一位的计算(例如XLI,当计算得到XL=40的时候,循环指针在第一位X上,已经不需要比较L这一位了)。最后将每一位(或两位)的值累加就可以得到罗马数字对应的整数值。

辅助函数twochar中。对于输入的两位罗马数字,判断该数字是否为特殊情况,若该数字属于特殊情况,返回该数字对应的整数值及判断结果。若该数字不属于特殊情况,返回第一位对应的整数值及判断结果。

下面是具体的代码实现,有详细的注释:

class Solution(object):
    def __init__(self):
        self.val={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}   #基本罗马数字字符和阿拉伯数字的转换
    
    def romanToInt(self, s):
        temp=s
        value=0
        key=False                                          #key用于控制当前字符是否跳过处理,默认为false
        for i in range(len(temp)):                         #遍历temp
            if key==True:                                  #key为True,表示当前位和上一位组成特殊情况,跳过这一位
                key=False                                  #key重置为false
                continue                                   #跳过本次循环
            elif i==len(temp)-1:                           #若当前位为最后一位,且不属于特殊情况
                value+=self.val[temp[i]]                   #将当前位对应的整数值累加到value中
            else:                                          #最一般的情况
                vall,key=self.twochar(temp[i]+temp[i+1])   #将当前位和下一位组合传入twochar中,得到对应的值和
                value+=vall                                #将得到整数值累加到value中
        return value
    
    def twochar(self,s):
        if(s[0]=='I'):                                     #如果第一位为I
            if(s[1]=='V'):                                 #且第二位为V
                return 4,True                              #返回4和True
            elif(s[1]=='X'):                               #以下跟上面三行的情况类似
                return 9,True
            else:
                return 1,False
        if(s[0]=='X'):
            if(s[1]=='L'):
                return 40,True
            elif(s[1]=='C'):
                return 90,True
            else:
                return 10,False
        if(s[0]=='C'):
            if(s[1]=='D'):
                return 400,True
            elif(s[1]=='M'):
                return 900,True
            else:
                return 100,False
        else:                                              #非特殊情况
            return self.val[s[0]],False                    #将第一位对应的整数值传出,key设为Flase

实例化函数以及调用部分

test=Solution()
print test.romanToInt('IV')
>>> 4
test=Solution()
print test.romanToInt('MCMXCIV')
>>> 1994

猜你喜欢

转载自blog.csdn.net/sada456/article/details/80597444