Преобразование римских цифр в арабские

  Автор:
  Комментариев нет
  781

На днях решала задачку 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
};
Преобразование римских цифр в арабские

   1 голос
Средняя оценка: 5 из 5
Если Вам понравилась статья и Вы нашли её полезной, поделитесь ею в соцсетях! Нажмите на кнопки ниже, чтобы сделать это прямо сейчас.

Анфиса Бреус

Анфиса Бреус - специалист по Wordpress с 2007 года. Создатель и разработчик шаблона "AB-Inspiration" для самостоятельной и профессиональной настройки сайтов на WordPress для бизнеса. Основатель клуба "Мастер WordPress" и автор эксклюзивных курсов по WordPress. Фрилансер. Спикер.

Оставьте свой комментарий:

Ваш адрес email не будет опубликован. Обязательные поля помечены *