罗马数字转整数

  1. 罗马数字转整数
    1. 题目描述
    2. 思路
    3. 代码
      1. 条件判断
      2. 根据结构

罗马数字转整数

题目地址:罗马数字转整数

题目描述

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

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 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.

思路

  1. 暴力条件判断:判断当前位的时候同时判断下一位,共有7种情况,分别以“I, V, X, L,C,D 和 M”开头
    M-> M
    C-> CM、CD、C
    D-> D
    X-> XC、XL、X
    L-> L
    I-> IX、IV、I
    V-> V
    
  2. 观察罗马数字的结构特点:
    I < V < X < L < C < D < M
    特殊情况:
    CM = M-C = -C+M = 900
    CD = D-C = -C+D = 400
    ......
    

    判断当前字符是否“小于”后一个字符,如果小于,则减去该字符对应的数值;如果大于则加上该字符对应的数值

代码

条件判断

def romanToInt(s: str) -> int:
    res = 0
    i = 0
    # 因为要修改 i 的数值,所以不能用rang()
    while i < len(s):
        if s[i] == 'M':
            res += 1000
        elif s[i] == 'C':
            if i + 1 < len(s) and s[i + 1] == 'M':
                res += 900
                i += 1
            elif i + 1 < len(s) and s[i + 1] == 'D':
                res += 400
                i += 1
            else:
                res += 100
        elif s[i] == 'D':
            res += 500
        elif s[i] == 'X':
            if i + 1 < len(s) and s[i + 1] == 'C':
                res += 90
                i += 1
            elif i + 1 < len(s) and s[i + 1] == 'L':
                res += 40
                i += 1
            else:
                res += 10
        elif s[i] == 'L':
            res += 50
        elif s[i] == 'I':
            if i + 1 < len(s) and s[i + 1] == 'X':
                res += 9
                i += 1
            elif i + 1 < len(s) and s[i + 1] == 'V':
                res += 4
                i += 1
            else:
                res += 1
        elif s[i] == 'V':
            res += 5
        i += 1
    print(res)
    return res

根据结构

def romanToInt2(s: str) -> int:
    res = 0
    str_num_dic = &#123;
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    &#125;
    for i in range(len(s) - 1):
        # 如果小于下一个字符就减去,如果大于就加上
        res = res - str_num_dic[s[i]]
        if str_num_dic[s[i]] < str_num_dic[s[i + 1]]
        else res + str_num_dic[s[i]]
    return res+str_num_dic[s[-1]]

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 changzeyan@foxmail.com

×

喜欢就点赞,疼爱就打赏