Дана строка, представляяющая собой число, записанное в римской нотации.
Нужно получить десятичное число.
Римские цифры представлены семью различными символами: I
, V
, X
, L
, C
, D
и M
.
Например, 2
записывается как II
римской цифрой, просто две единицы складываются вместе. 12
записывается как XII
, что означает просто X
+ II
. Число 27
записывается как XXVII
, то есть XX
+ V
+ II
.
Римские цифры обычно пишутся от наибольшего к наименьшему слева направо. Однако цифра, обозначающая четыре, не является IIII
. Вместо этого число четыре записывается как IV
. Поскольку единица стоит перед пятеркой, мы вычитаем ее, получая четыре. Тот же принцип применим к числу девять, которое записывается как IX
. Существует шесть случаев, когда используется вычитание:
I
можно поместить перед V
(5) и X
(10), чтобы получилось 4 и 9.
X
можно поместить перед L
(50) и C (100), чтобы получилось 40 и 90.
C
можно поместить перед D
(500) и M (1000), чтобы получилось 400 и 900.
Входные данные: s = “III”
Результат: 3
Пояснение: III = 3.
Входные данные: s = “LVIII”
Результат: 58
Пояснение: L = 50, V= 5, III = 3.
Входные данные: s = “MCMXCIV”
Результат: 1994
Пояснение: M = 1000, CM = 900, XC = 90 и IV = 4.
class Solution {
public:
int romanToInt(string s) {
int ans = 0;
unordered_map <char,int> mp{
{'I',1}, {'V',5}, {'X',10}, {'L',50}, {'C',100}, {'D',500}, {'M',1000}};
for(int i = 0; i < s.size(); i++) {
if(mp[s[i]] < mp[s[i+1]]) {
// для IV,CM, XL, etc...
ans -= mp[s[i]];
} else {
ans += mp[s[i]];
}
}
return ans;
}
};