新手区 13. Roman to Integer

沐芓李 · 2017年05月23日 · 最后由 沐芓李 回复于 2017年05月25日 · 1528 次阅读

题目描述

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

给定一个罗马数字,把它转换为一个整数。
输入被保证在 1 到 3999 之间。

原文地址

思路方法

罗马数字的规则详细见帖子下方。
可以很简单去思考这个规则,就是对于输入的罗马数字字符串,从后向前扫描,遇到前面数大于等于后面的最大数的时候,相加;遇到前面数小于后面的最大数的时候,相减。

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        dic = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
        result = 0
        maxDigit = 1

        for i in range(len(s)-1, -1, -1):
            if dic[ s[i] ] >= maxDigit:
                #存放已经扫描过的最大数值
                maxDigit = dic[ s[i] ]
                result = result + dic[ s[i] ]
            else:
                result = result - dic[ s[i] ]

        return result

知识点

罗马数字拼写规则
罗马数字共有 7 个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有 “0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。

  • 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
  • 右加左减:
    • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
    • 左减的数字有限制,仅限于 I、X、C。比如 45 不可以写成 VL,只能是 XLV
    • 但是,左减时不可跨越一个位值。比如,99 不可以用 IC( {\displaystyle 100-1} 100-1)表示,而是用 XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同于阿拉伯数字每位数字分别表示。)
    • 左减数字必须为一位,比如 8 写成 VIII,而非 IIX。
    • 右加数字不可连续超过三位,比如 14 写成 XIV,而非 XIIII。(见下方 “数码限制” 一项。)
  • 加线乘千:
    • 在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以 1000,即是原数的 1000 倍。
    • 同理,如果上方有两条横线,即是原数的 1000000( {\displaystyle 1000{2}} 1000{{2}})倍。
  • 数码限制:
    • 同一数码最多只能连续出现三次,如 40 不可表示为 XXXX,而要表示为 XL。
    • 例外:由于 IV 是古罗马神话主神朱庇特(即 IVPITER,古罗马字母里没有 J 和 U)的首字,因此有时用 IIII 代替 IV。

range()

>>> range(1, 5)    #从1 到 5 ,但是不包含5
[1, 2, 3, 4]
>>> range(1, 5, 2)   #从1 到 5,间隔是2,不包含5
[1, 3]
>>> range(5)    #从 0 到 5,不包含5
[0, 1, 2, 3, 4]
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

给你的坚持点个赞

😜 谢谢 思寒老师

沐芓李 代码入门 中提及了此贴 07月05日 10:59
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册