题目
罗马数字由七种不同的符号表示: I, V, X, L, C, D and 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。
罗马数字通常从左到右从大到小书写。然而,四的数字不是IIII。相反,数字4被写为IV。因为1在5之前,所以我们将其减为4。同样的原理也适用于数字九,即九。有六种情况下使用减法:
我可以放在V(5)和X(10)之前,得到4和9。
X可以放在L(50)和C(100)之前,以形成40和90。
C可以放在D(500)和M(1000)之前,以形成400和900。
给定一个罗马数字,将其转换为整数。
示例 1:
输入: s = "III"
输出: 3
说明: III = 3.
示例 2:
输入: s = "LVIII"
输出: 58
说明: L = 50, V= 5, III = 3.
示例 3:
输入: s = "MCMXCIV"
输出: 1994
说明: M = 1000, CM = 900, XC = 90 and IV = 4.
思路
- 从头往后扫描。如果是低位 + 高位 则合成一个,用高位 - 低位。 否则 累加
function romanToInt(s: string): number {
const symbols = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
const values = [1, 5, 10, 50, 100, 500, 1000];
const indexs = symbols.reduce((obj, curr, i) => {
obj[curr] = i;
return obj;
}, {});
let sum = 0;
for (let i = 0; i < s.length; i++) {
const symbol1 = s[i];
const symbol2 = s[i + 1];
const index1 = indexs[symbol1];
const index2 = indexs[symbol2];
if (!symbol2 || index1 >= index2) {
sum += values[index1];
} else {
sum += values[index2] - values[index1];
i++;
}
}
return sum;
}