Skip to main content

罗马数字转整数

题目

罗马数字包含以下七种字符: I, V, X, L, C, DM.

字符数值
I1
V5
X10
L50
C100
D500
M1000

例如, 罗马数字 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) 的左边,来表示 49.
  • X 可以放在 L (50)C (100) 的左边,来表示 4090.
  • C 可以放在 D (500)M (1000) 的左边,来表示 400900.
  • 给定一个罗马数字,将其转换成整数. 输入确保在 13999 的范围内.
提示:
  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字, 且表示整数在范围 [1, 3999]
示例
输入: 'LVIII'
输出: 58
解释: (L = 50), (V = 5), (III = 3)
输入: 'MCMXCIV'
输出: 1994
解释: (M = 1000), (CM = 900), (XC = 90), (IV = 4)

题解

先根据 6 种特殊情况将罗马数字切成数组, 再根据 romaMap 将所有的元素累加和.

/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
const romaMap = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
IV: 4,
IX: 9,
XL: 40,
XC: 90,
CD: 400,
CM: 900,
}

const romaSplit = s.match(/(CM)|(CD)|(XC)|(XL)|(IX)|(IV)|(\w)/g)
return romaSplit.reduce((acc, val) => acc + romaMap[val], 0)
}