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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值