Римские числа представлены с помощью семи «цифр»: I
, V
, X
, L
, C
, D
и M
.
Символ Значение
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Например, чтобы записать число 2
нужно поставить рядом две единицы — II
, 12
это десять и два — XII
, а 27
это двадцать, пять и два — XXVII
. Запись ведётся слева направо от большего разряда к меньшему.
Однако, есть особенность. Например, четыре — это не IIII
, а IV
. Вместо того чтобы складывать четыре единицы можно отнять одну от пяти и получить более короткую запись. Аналогично записывается девять как IX
.
Всего есть 6 случаев когда применяется вычитание:
I
пишется перед V
(5) и X
(10) — это 4 и 9 соответственноX
пишется перед L
(50) и C
(100) — это 40 и 90 соответственноC
пишется перед D
(500) и M
(1000) — это 400 и 900 соответственноИтак, дана римская запись числа — нужно вернуть обыкновенную, десятичную. Число на входе в пределах [1 .. 3999]
.
Примеры:
romanToInt('III') === 3;
romanToInt('IV') === 4;
romanToInt('IX') === 9;
// L = 50, V = 5, III = 3
romanToInt('LVIII') === 58;
// M = 1000, CM = 900, XC = 90 and IV = 4
romanToInt('MCMXCIV') === 1994;
Сперва заведём словарь соответствия символов и значений, как указано в условии.
const sym2num = {
'M': 1000,
'D': 500,
'C': 100,
'L': 50,
'X': 10,
'V': 5,
'I': 1
};
Решение «в лоб» — пробегаемся по строке слева направо и накапливаем сумму.
let res = 0;
for (let i = 0; i < s.length; i++) {
res += sym2num[s[i]];
}
Проверим как это работает на примере:
Input: LVIII
- LVIII; res = 0 + 50;
^
- LVIII; res = 50 + 5;
^
- LVIII; res = 55 + 1;
^
- LVIII; res = 56 + 1;
^
- LVIII; res = 57 + 1;
^
Result: 58
Отлично!