На днях решала задачку JavaScript на Leetcode. Саму задачу можно посмотреть здесь: Roman to Integer
Кратко суть задачи. Дается римское число, его необходимо преобразовать в арабское.
В римской системе чисел есть 7 символов:I, V, X, L, C, D, M.
Символ Значение I 1 V 5 X 10 L 50 C 100 D 500 M 1000
Римские цифры пишутся от большего числа к меньшему слева направо. Например 2 = II, 3 = III, а вот четыре будет выглядеть так: IV, поскольку I перед V то мы от V вычитаем I получается 4 . Таких примеров вычитаний 6
I
может быть размечена передV
(5) иX
(10) чтобы получить 4 и 9.X
может быть размещено передL
(50) иC
(100), чтобы получить 40 и 90.C
может быть размещено передD
(500) иM
(1000), чтобы получить 400 и 900.
Решение задачи «Преобразование римских цифр в арабские»
Дано римское число
let s = "MCMXCIV";
Вариант 1 (более подробный)
1. создаем объект, где сопоставляем 7 римских символов с арабскими цифрами
const symbol = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 }
2. создаем переменную, которая выведет в конце результат
let result = 0;
3. создаем цикл for (количество итераций = количеству римских символов s.length)
for (let i = 0; i < s.length; i++) { }
4. внутри цикла создаем 2 переменные current и next со значением текучего символа и следующего символа
current = symbol[s[i]]; next = symbol[s[i + 1]];
Например в первой итерации:
current = symbol[s[i]] => symbol["M"] => 1000 next = symbol[s[i]] => symbol["C"] =>100
5. дальше проверяем, если значение текущего символа меньше следующего, из следующего вычитаем текущий и плюсуем в результирующую переменную и увеличиваем счетчик (i++), поскольку следующее число одно целое с текущим (например IV).
Если больше, плюсуем текущую.
if (current < next){ result += next - current // IV -> 5 - 1 = 4 i++ } else { result += current }
6. возвращаем результат
return result;
Код целиком:
let romanToInt = (s) => { const symbols = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000, }; let result = 0; for (let i = 0; i < s.length; i++) { const current = symbols[s[i]]; const next = symbols[s[i + 1]]; if (cur < next) { result += next - current; i++; } else { result += current; } } return result; };
Вариант 2 (оптимизированный)
var romanToInt = function(s) { const symbols = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000, }; let result = 0; for (let i = 0; i < s.length; i++) { symbols[s[i]] < symbols[s[i+1]] ? result -= symbols[s[i]] : result += symbols[s[i]]; } return value };
Средняя оценка: 5 из 5