Решения 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”