zoukankan      html  css  js  c++  java
  • LeetCode专题-Python实现之第13题:Roman to Integer

    导航页-LeetCode专题-Python实现

    相关代码已经上传到github:https://github.com/exploitht/leetcode-python
    文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小写问题等等;更合理的代码实现参考我的github repo

    1、读题

    Given a roman numeral, convert it to an integer.

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

    题意很简单,给一个罗马数字,转换成阿拉伯数字,罗马数字范围是1-3999.

    罗马数字是:

    {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    

    2、解题

    要解这道题第一步是搞清楚罗马数字的个啥,查阅维基百科有如下描述:


    罗马数字共有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。

    上面这一大堆,归纳起来和我们解题相关的其实就一句话,右加左减。加简单,读到一个字符是V就加上5,简单的事情,减怎么处理呢?从左往右就涉及到读取一个数字,增加了这个数字之后,发现这个数字后面有一个更大的,那么当前数字其实应该被减,但是处理后面一个数字的时候要操作前一个数字,又得维护一个单独的索引,关键是操作的这个数字是前面处理过的。反过来思考行不行呢?我从字符串最后一个开始解析,读到数字就累加,但是加一个判断,如果读到的数字比前一个数字小,那么就不做加法,而是采取减法。这样做就是解析一个字符,处理一个数字,代码实现如下:

    class Solution(object):
        def romanToInt(self, s):
            """
            :type s: str
            :rtype: int
            """
            # 罗马数字和阿拉伯数字的对应关系
            roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
            result = roman_dict.get(s[-1])
            for index in range(len(s)-2, -1, -1):
                if roman_dict.get(s[index]) < roman_dict.get(s[index+1]):
                    result -= roman_dict.get(s[index])
                else:
                    result += roman_dict.get(s[index])
            return result
    
  • 相关阅读:
    python 并发编程 多线程 event
    python 并发编程 多线程 定时器
    python 并发编程 多线程 信号量
    linux top 查看CPU命令
    python 并发编程 多线程 GIL与多线程
    python 并发编程 多线程 死锁现象与递归锁
    python 并发编程 多线程 GIL与Lock
    python GIL全局解释器锁与互斥锁 目录
    python 并发编程 多线程 GIL全局解释器锁基本概念
    执行python程序 出现三部曲
  • 原文地址:https://www.cnblogs.com/cloudgeek/p/7597418.html
Copyright © 2011-2022 走看看