zoukankan      html  css  js  c++  java
  • 13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

     例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

    通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

    I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
    C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

    示例 1:

    输入: "III"
    输出: 3


    示例 2:

    输入: "IV"
    输出: 4


    示例 3:

    输入: "IX"
    输出: 9


    示例 4:

    输入: "LVIII"
    输出: 58
    解释: L = 50, V= 5, III = 3.


    示例 5:

    输入: "MCMXCIV"
    输出: 1994
    解释: M = 1000, CM = 900, XC = 90, IV = 4.


    思路:
    首先建立一个map来映射符号和值,然后遍历字符串:
    若当前字符代表的值不小于其右边,就加上该值;否则就减去该值。
    以此类推到最左边的数,最终得到结果。
     1 class Solution(object):
     2     def romanToInt(self, s):
     3         """
     4         :type s: str
     5         :rtype: int
     6         """
     7         myMap = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
     8         result = 0
     9         length = len(s)
    10         for i in range(length):
    11             # 注意比较的是map里的value(加上myMap[]),而不是index
    12             if i < length-1 and myMap[s[i]] < myMap[s[i+1]]:
    13                 result -= myMap[s[i]]
    14             else:
    15                 result += myMap[s[i]]
    16         return result
     
  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/panweiwei/p/12681880.html
Copyright © 2011-2022 走看看