Leetcode: если дана римская цифра, преобразуйте ее в целое число. Гарантируется, что ввод находится в диапазоне от 1 до 3999.

Чтобы решить эту проблему, мне нужно было сначала понять, как читать римские цифры и переводить их рукой.

Https://www.mathsisfun.com/roman-numerals.html содержит четкое и лаконичное объяснение римских цифр. Для решения этой проблемы вам нужно по-настоящему понять только эту диаграмму:

Правила вычисления римских ›› Integer

  1. (ДОБАВЛЕНИЕ) Значение каждого символа (обычно) складывается слева направо:
  • MMLVII (1000 + 1000 + 50 + 5 + 1 + 1) = 2057

2. (ВЫЧИТАНИЕ) Когда перед большим числом ставится меньшее число.

  • XIX (10 + (10-1)) = 19

Простым решением было создать цикл for для каждого символа в строке, содержащей римские цифры, и преобразовать их в их целочисленные значения. Произведите расчеты до итоговой суммы в соответствии с двумя приведенными выше правилами сложения и вычитания.

int romanToInt(string s) {
        
        int total = 0;
        for(int i = 0; i < s.length(); i++){
            
        //1.The letters are arranged from left to right 
        in descending order of value to form a number
            if(integer_of(s[i])  <= interger_of[s[i]]) {
              total += integer_of(s[i]);
            }
        //2.when you see a lower value in front of a 
        higher value (subtract)
            else  {
              total += integer_of(s[i]);
            }
        }
        return total;
    }

Лучший способ сохранить таблицу для преобразования римских цифр в соответствующие им целочисленные значения - использовать хэш-карту:

map<char, int> m = {{'I', 1}, {'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};

Собираем все вместе:

int romanToInt(string s) {
        
        map<char, int> m = {{'I', 1}, {'V', 5},{'X', 10},{'L', 50},
        {'C', 100},{'D', 500},{'M', 1000}};
        
        int total = 0;
        for(int i = 0; i < s.length(); i++){
            if(m[s[i+1]] <= m[s[i]])  total += m[s[i]]; 
            else  total -= m[s[i]];  
        }
        return total;
    }

Easy-Peasy Lemon Squeezy!

Как всегда, я приветствую отзывы и обсуждения.