Leetcode题库——13.罗马数字转整数


@author: ZZQ
@software: PyCharm
@file: Luoma2Int.py
@time: 2018/9/16 17:06
要求: 罗马数字转数字
字符 数值
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。这个特殊的规则只适用于以下六种情况:
1) I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
2) X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
3) C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
思路: 每次先将当前罗马数字表示的数值加上,然后判断后面跟的是不是六种特殊情况之一,如果是,则减去二倍的当前罗马数字表示的数值。



class Solution():
    def __init__(self):
        pass

    def str2int(self, n):
        if n == 'I':
            return 1
        if n == 'V':
            return 5
        if n == 'X':
            return 10
        if n == 'L':
            return 50
        if n == 'C':
            return 100
        if n == 'D':
            return 500
        if n == 'M':
            return 1000

    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        roman_len = len(s)
        value = 0
        currstr = ''
        for i in range(0, roman_len):
            value += self.str2int(s[i])
            if currstr == 'I' and s[i] == 'V':
                value += - 2 * self.str2int(currstr)
            if currstr == 'I' and s[i] == 'X':
                value += - 2 * self.str2int(currstr)
            if currstr == 'X' and s[i] == 'L':
                value += - 2 * self.str2int(currstr)
            if currstr == 'X' and s[i] == 'C':
                value += - 2 * self.str2int(currstr)
            if currstr == 'C' and s[i] == 'D':
                value += - 2 * self.str2int(currstr)
            if currstr == 'C' and s[i] == 'M':
                value += - 2 * self.str2int(currstr)
            currstr = s[i]
        return value


if __name__ == "__main__":
    x = "IX"
    answer = Solution()
    print answer.romanToInt(x)
posted @ 2018-09-18 20:55  恩zzq我是  阅读(164)  评论(0编辑  收藏  举报