На днях решала задачку 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



