Добавить в корзинуПозвонить
Найти в Дзене
Записки о Java

LeetCode №12: Integer to Roman — как превратить число в римские цифры

Дано целое число в диапазоне от 1 до 3999, преобразуйте его в римское число. Римские цифры — это способ записи чисел с помощью букв: Но есть особые случаи: Мы не можем просто делить на 1000, 500, 100..., потому что нужно учитывать исключения вроде IV, IX и т.д. Создать список всех возможных значений — включая обычные и исключения — и обрабатывать их по убыванию. Например: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] На каждом шаге: Цель: получить MCMXCIV Шаг - 1, NUM - 1994, VALUES[i] - 1000, SYMBOL - "M", ДЕЙСТВИЕ - num >= 1000→ добавляем "M",num = 994 Шаг - 2, NUM - 994, VALUES[i] - 900, SYMBOL - "CM", ДЕЙСТВИЕ - >= 900→ добавляем "CM",num = 94 Шаг - 3, NUM - 94, VALUES[i] - 100, SYMBOL - "C", ДЕЙСТВИЕ - 94 < 100 → пропускаем Шаг -4, NUM - 94, VALUES[i] - 90, SYMBOL - "XC", ДЕЙСТВИЕ - >= 90→ добавляем "XC",num = 4 Шаг - 5, NUM - 4, VALUES[i] - 5, SYMBOL - "V", ДЕЙСТВИЕ - 4 < 5 → пропускаем Шаг - 6, NUM - 4, VALUES[i] - 4, SYMBOL - "IV", ДЕЙСТВИЕ - >= 4→ добавляем "IV",num
Оглавление
Рисунок: LeetCode №10 - Integer to Romen
Рисунок: LeetCode №10 - Integer to Romen

Условие задачи

Дано целое число в диапазоне от 1 до 3999, преобразуйте его в римское число.

Римские цифры — это способ записи чисел с помощью букв:

  • I - 1
  • V - 5
  • X - 10
  • L - 50
  • C - 100
  • D - 500
  • M - 1000

Но есть особые случаи:

  • 4 → IV (5 - 1)
  • 9 → IX (10 - 1)
  • 40 → XL
  • 90 → XC
  • 400 → CD
  • 900 → CM

Подход к решению

Мы не можем просто делить на 1000, 500, 100..., потому что нужно учитывать исключения вроде IV, IX и т.д.

Идея:

Создать список всех возможных значений — включая обычные и исключения — и обрабатывать их по убыванию.

Например:

[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]

На каждом шаге:

  • Пока число ≥ текущего значения — добавляем соответствующую букву
  • Вычитаем это значение из числа
  • Переходим к следующему

Преимущества подхода

  • Простой и понятный
  • Не требует сложной логики с условиями
  • Легко масштабируется
  • Работает за O(1) — максимум 3999 → MMMCMXCIX

Решение на Java с комментариями

Рисунок: решение задачи на JAVA - часть 1
Рисунок: решение задачи на JAVA - часть 1
Рисунок: решение задачи на JAVA - часть 2
Рисунок: решение задачи на JAVA - часть 2

Как это работает? Разберём пример: num = 1994

Цель: получить MCMXCIV

Шаг - 1, NUM - 1994, VALUES[i] - 1000, SYMBOL - "M", ДЕЙСТВИЕ -

num >= 1000→ добавляем "M",num = 994

Шаг - 2, NUM - 994, VALUES[i] - 900, SYMBOL - "CM", ДЕЙСТВИЕ -

>= 900→ добавляем "CM",num = 94

Шаг - 3, NUM - 94, VALUES[i] - 100, SYMBOL - "C",

ДЕЙСТВИЕ - 94 < 100 → пропускаем

Шаг -4, NUM - 94, VALUES[i] - 90, SYMBOL - "XC",

ДЕЙСТВИЕ - >= 90→ добавляем "XC",num = 4

Шаг - 5, NUM - 4, VALUES[i] - 5, SYMBOL - "V",

ДЕЙСТВИЕ - 4 < 5 → пропускаем

Шаг - 6, NUM - 4, VALUES[i] - 4, SYMBOL - "IV",

ДЕЙСТВИЕ - >= 4→ добавляем "IV",num = 0

✅ Результат: "M" + "CM" + "XC" + "IV" = "MCMXCIV" — верно!

Объяснение словами пятилетнего ребёнка

Представь, что ты строишь число из кубиков-значений, как из LEGO.

У тебя есть кубики:

  • Огромный кубик M = 1000
  • Почти такой же CM = 900
  • Поменьше C = 100
  • И даже крошечные: I = 1

Ты хочешь собрать число 1994.

👉 Как ты это сделаешь?

  1. Берёшь один кубик M (1000) → осталось 994
  2. Берёшь один кубик CM (900) → осталось 94
  3. Берёшь один кубик XC (90) → осталось 4
  4. Берёшь один кубик IV (4) → всё!

Теперь ты читаешь, какие кубики использовал:
M → CM → XC → IV → вместе: MCMXCIV

Это и есть римское число!

Вывод

Задача Integer to Roman учит нас, что иногда проще перечислить все случаи, чем писать сложную логику.

💡 Главный урок:
Когда в задаче есть
шаблоны и исключения — создайте таблицу и пройдите по ней.

Теперь ты можешь превращать любое число в римское.

Пример, рассмотренный в статье, можно найти по адресу:

https://github.com/ShkrylAndrei/leetcode/blob/main/src/main/java/info/shkryl/task12_integerToRoman/Solution.java