Рубрики
Без рубрики

Решение: Роман целое число

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как Этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема летакода # 13 (Легко): Роман в целое число

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Римские цифры представлены семь разных символов: Я , V С X , L , C , D и М Отказ

1 I
5 V
10 X
50 L
100 C
500 D
1000 M

Например, 2 написано как II в римском цифре, только два добавлена вместе. 12 написано как XII , который просто X + II Отказ Номер 27 написано как XXVII , что это XX + V + II Отказ

Римские цифры, как правило, являются крупнейшими для наименьшего слева направо. Тем не менее, цифру для четырех не является IIII Отказ Вместо этого номер четыре написан как IV Отказ Потому что то, что еще до пяти, мы вычвели его, что делает четыре. Тот же принцип применяется к числу девять, который написан как IX Отказ Существует шесть случаев, когда вычитание используется:

  • Я можно разместить до V ( 5 ) и Икс ( 10 ) сделать 4 и 9 Отказ
  • Х можно разместить до Л ( 50 ) и C ( 100 ) сделать 40 и 90 Отказ
  • C можно разместить до D ( 500 ) и М ( 1000 ) сделать 400 и 900 Отказ

Учитывая римское число, преобразуйте его в целое число.

Примеры:

Вход:
Выход: 3
Вход:
Выход: 4
Вход:
Выход: 9
Вход:
Выход: 58
Объяснение:
Вход:
Выход: 1994
Объяснение:

Ограничения:

  • 1 длиной
  • S Содержит только символы («Я», «V», «X», «L», «C», «D», «M») Отказ
  • Это гарантируется, что S является действительным римским числом в диапазоне [1, 3999] .

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Единственная действительно сложная вещь о подсчете в римских цифрах, заключается в том, когда числовое число используется в качестве субтроактивного значения, а не добавки. В “IV” Например, значение “Я” , 1 , вычитается из ценности “V” , 5 Отказ В противном случае вы просто просто добавляете значения всех цифр.

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

Итак, это легкая вещь, чтобы сделать здесь, будет повторяться назад через S Посмотрите на ценность для каждой буквы, а затем добавьте его на наш ответ ( ANS ). Если мы столкнулись со значением буквенного значения, которое меньше, чем самый большой, который пока не видел, оно должно быть вычтено, а не добавлено.

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

Таким образом, мы можем избежать необходимости дополнительной переменной здесь. Мы бежите в случае повторных чисел, вызывающих проблему (т. Е. «III» ), но мы можем очистить, что путем умножения Num по любому количеству между 2 и 4 прежде чем сравнивать его с анс , поскольку цифры прыгают по значению с шагом по крайней мере 5x Отказ

Как только мы знаем, как правильно идентифицировать субтрактивную цифру, это простое дело, чтобы просто перейти через S найти и вернуть анс .

Реализация:

JavaScript и Python довольно быстро работают с объектами/испариванием, поэтому мы будем использовать таблицу поиска для римских цифр.

Java и C ++ не имеют дело с объектами, поэтому мы будем использовать коммутатор, чтобы функционировать так же.

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

const roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

var romanToInt = function(S) {
    let ans = 0
    for (let i = S.length-1; ~i; i--) {
        let num = roman[S.charAt(i)]
        if (4 * num < ans) ans -= num
        else ans += num
    }
    return ans
};

Код Python:

( Перейти к : Описание проблемы Идея решения

roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

class Solution:
    def romanToInt(self, S: str) -> int:
        ans = 0
        for i in range(len(S)-1,-1,-1):
            num = roman[S[i]]
            if 4 * num < ans: ans -= num
            else: ans += num
        return ans

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public int romanToInt(String S) {
        int ans = 0, num = 0;
        for (int i = S.length()-1; i >= 0; i--) {
            switch(S.charAt(i)) {
                case 'I': num = 1; break;
                case 'V': num = 5; break;
                case 'X': num = 10; break;
                case 'L': num = 50; break;
                case 'C': num = 100; break;
                case 'D': num = 500; break;
                case 'M': num = 1000; break;
            }
            if (4 * num < ans) ans -= num;
            else ans += num;
        }
        return ans;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    int romanToInt(string S) {
        int ans = 0, num = 0;
        for (int i = S.size()-1; ~i; i--) {
            switch(S[i]) {
                case 'I': num = 1; break;
                case 'V': num = 5; break;
                case 'X': num = 10; break;
                case 'L': num = 50; break;
                case 'C': num = 100; break;
                case 'D': num = 500; break;
                case 'M': num = 1000; break;
            }
            if (4 * num < ans) ans -= num;
            else ans += num;
        }
        return ans;        
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-roman-to-integer-567f”