Roman to Integer

题目描述

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

解题方法

这两道题目考的频率还挺高的,主要是要记得罗马数字的概念, 字符对应的数字。 将罗马数字转换为整数其实就是按顺序读出来

  • 如果前面的数比后面的数大,那么就是additional notation的,就加到结果了
  • 如果前面的数比后面的数小,那么是substractive notation的,而substractive notation的只能是两位,所以只要判断前后两位就可以

从后往前读

从倒数第二位往前读,如果当前的字符s[i]代表的数字比s[i+1]代表的数字小,说明它们两个是substractive的,应当减去当前的value

从前往后读

用一个variable pre保存前一个字符,没遇到一个新的都先加到result上,如果发现是substractive的,就应该减去它的两倍(因为之前加过一次)

Solution

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        dic = {
            "I": 1,
            "V": 5,
            "X": 10,
            "L": 50,
            "C": 100,
            "D": 500,
            "M": 1000
        }
        length = len(s)
        result = 0 
        result += dic[s[-1]]
        for i in range(length - 2, -1, -1):
            if dic[s[i]] >= dic[s[i+1]]:
                result += dic[s[i]]
            else:
                result -= dic[s[i]]
        return result

Reference