Написано: 26.02.2023

13. Римское число перевести в десятичное (Roman to Integer)

easy

Задание.

Дана строка, представляяющая собой число, записанное в римской нотации.

Нужно получить десятичное число.

Римские цифры представлены семью различными символами: I, V, X, L, C, D и M.

LeetCode-000013

Например, 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.

Пример 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 и 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;
    }
};