LeetCode | 13. Roman to Integer 字符串规则

Romannumerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol      Value

I             1

V             5

X             10

L             50

C             100

D             500

M             1000

Forexample, two is written as II in Roman numeral, just two one's added together. Twelveis written as, XII, which issimply X +II. The numbertwenty seven is written as XXVII, which is XX + V + II.

Romannumerals are usually written largest to smallest from left to right. However,the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the fivewe subtract it making four. The same principle applies to the number nine,which is written as IX. There aresix instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Givena roman numeral, convert it to an integer. Input is guaranteed to be within therange from 1 to 3999.

Example 1:

Input: "III"

Output: 3

Example 2:

Input: "IV"

Output: 4

Example 3:

Input: "IX"

Output: 9

Example 4:

Input: "LVIII"

Output: 58

Explanation: C = 100, L = 50, XXX = 30 and III =3.

Example 5:

Input: "MCMXCIV"

Output: 1994

Explanation: M = 1000, CM = 900, XC = 90 and IV =4.

这是一道字符串规律的题目,通过观察题目我们可以发现,假设输入的字符串为s,则s中存在以下规律,s中只可能是两个字符或者是一个字符为一组,当一个字符为一组的时候,sum加上这个字符代表的值,当两个字符为一组的时候,sum加上这两个字符代表的值的差,sum最后的值就是这个罗马数字代表的真正的值

通过这一题我明白了,在python中,迭代器的值是不能修改的,这一点和C++的for循环不一样,索引值不能修改,所以在使用需要修改索引值的循环的时候需要使用while I <n: i++;来代替

然后就是在Python中,当出现某个代码块中需要多次调用某个数组中的值的时候,最好提前将相应的值存在变量中,然后在之后的计算中直接使用,这样能够极大的节省运行时间

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        theL = len(s)
        theData = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        sum = 0
        i = 0
        while i < theL:
            if i == theL - 1 or (theData[s[i + 1]] >= theData[s[i + 1]] and theData[s[i]] >= theData[s[i + 1]]):
                sum += theData[s[i]]
            else:
                sum += theData[s[i + 1]] - theData[s[i]]
                i += 1
            i += 1
        return sum

猜你喜欢

转载自blog.csdn.net/u012737193/article/details/80156180