罗马数字转整数

罗马数字转整数

罗马数字包含以下七种字符: 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:

输入: s = "III"

输出: 3

示例 2:

输入: s = "IV"

输出: 4

示例 3:

输入: s = "IX"

输出: 9

示例 4:

输入: s = "LVIII"

输出: 58

解释: L = 50, V= 5, III = 3.

示例 5:

输入: s = "MCMXCIV"

输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
  • 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
  • IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。

解法

创建一个 romanToIntMap 其中保存罗马字符到数字的映射,创建一个 specialMap 其中保存特殊情况到整数的映射,创建一个 num 保存最终返回的整数,初始值为0。从左到右遍历s,如果 s[i] + s[i+1] 存在于 specialMap,则将值累加到 num,否则从 romanToIntMap 取值将结果累加到 num。

ts 复制代码
function romanToInt(s: string): number {
    const romanToIntMap = new Map([
        ['I',1],
        ['V',5],
        ['X',10],
        ['L',50],
        ['C',100],
        ['D',500],
        ['M',1000]
    ])

    const specialMap = new Map([
        ['IV',4],
        ['IX',9],
        ['XL',40],
        ['XC',90],
        ['CD',400],
        ['CM',900]
    ])

    let num = 0
    let i = 0
    while(i<s.length) {
        if(specialMap.has(s[i] + s[i+1])) {
            num += specialMap.get(s[i] + s[i+1])
            i+=2
        } else {
            num += romanToIntMap.get(s[i])
            i++
        }
    }
    return num
};
相关推荐
音仔小瓜皮几秒前
【bug记录10】同一iOS webview页面中相同的两个svg图标出现部分显示或全部不显示的情况
前端·bug·html5·xhtml·webview
涔溪15 分钟前
css3弹性布局
前端·css·css3
Array[赵]28 分钟前
npm 最新国内淘宝镜像地址源 (旧版已不能用)
前端·npm·node.js
于慨30 分钟前
pnpm报错如Runing this command will add the dependency to the workspace root所示
前端·npm
田本初1 小时前
【NodeJS】Express写接口的整体流程
前端·javascript·node.js·express
知野小兔1 小时前
【Vue】Keep alive详解
前端·javascript·vue.js
好奇的菜鸟1 小时前
TypeScript中的接口(Interface):定义对象结构的强类型方式
前端·javascript·typescript
小胖霞1 小时前
monorepo和pnpm
前端
橘子味的冰淇淋~1 小时前
全面解析 Map、WeakMap、Set、WeakSet
前端·javascript·vue.js
小闫BI设源码1 小时前
uniapp中的事件:v-on
前端·vue.js·uni-app