Дана строка с римским числом. Преобразуйте её в целое число. Значения символов:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Примеры
Пример 1
Input: s = "III"
Output: 3
Пояснение
III = 3.
Пример 2
Input: s = "LVIII"
Output: 58
Пояснение
L = 50, V = 5, III = 3.
Решение
Решение
var romanToInt = function(s) { const symbols = { "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; const main = { 'X': 'I', 'V': 'I', 'C': 'X', 'L': 'X', 'D': 'C', 'M': 'C' }; let lastMain = null; let sum = 0; for (let i = s.length - 1; i >= 0; i--) { const sym = s[i]; const num = symbols[sym]; if (!lastMain) { sum += num; } else if (main[lastMain] === sym) { sum -= num; } else { sum += num; } if (main[sym]) { lastMain = sym; } } return sum;};
Решение 2
// Временная сложность: O(n), где n - длина строки.// Пространственная сложность: O(1) (фиксированный размер словаря symbols).var romanToInt = function(s) { const symbols = { "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; let sum = 0; let prevValue = 0; // Значение предыдущего символа (справа) for (let i = s.length - 1; i >= 0; i--) { const currentValue = symbols[s[i]]; // Если текущее значение меньше предыдущего (например, I перед V в IV), // значит это случай вычитания. if (currentValue < prevValue) { sum -= currentValue; } else { sum += currentValue; } prevValue = currentValue; } return sum;};