Алгоритмы римских цифр: Реализация на Python, JavaScript и Java
Узнайте, как реализовать алгоритмы перевода римских цифр на Python, JavaScript и Java. Оптимизированный код, анализ сложности и объяснение жадного алгоритма.
Преобразование между римскими цифрами и целыми числами — это классическая задача программирования, которая встречается на собеседованиях, в спортивном программировании и реальных приложениях. В этом руководстве представлены оптимизированные реализации на Python, JavaScript и Java с объяснением алгоритмов.
Понимание задачи
Нам нужно решить две взаимосвязанные задачи:
- Целое число в римское: Преобразовать арабское число (например, 1994) в римские цифры (MCMXCIV).
- Римское в целое число: Преобразовать римские цифры (например, MCMXCIV) в арабское число (1994).
Ограничения
- Диапазон ввода: от 1 до 3999 (стандартный диапазон римских цифр).
- Использование стандартной субтрактивной нотации (IV, IX, XL, XC, CD, CM).
- Обработка всех валидных комбинаций.
Подход жадного алгоритма (Greedy Algorithm)
Оба преобразования используют стратегию жадного алгоритма:
Целое в римское (Жадный подход)
- Создайте карту соответствия значений и римских символов в порядке убывания.
- Для каждой пары:
- Используйте максимально возможное количество этого символа.
- Вычтите значение из остатка числа.
- Повторяйте, пока число не станет равным нулю.
Римское в целое (Жадный подход)
- Сканируйте строку римских цифр слева направо.
- Для каждого символа:
- Если он меньше следующего символа, вычтите его значение (субтрактивная нотация).
- В противном случае прибавьте его.
- Верните накопленную сумму.
Реализация на Python
Целое в римское
def int_to_roman(num: int) -> str:
"""
Преобразование целого числа в римские цифры.
Временная сложность: O(1) - фиксированное число итераций (13)
Пространственная сложность: O(1)
"""
# Карта в порядке убывания
values = [
(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'),
(100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'),
(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')
]
result = []
for value, numeral in values:
count = num // value
if count:
result.append(numeral * count)
num -= value * count
return ''.join(result)
Римское в целое
def roman_to_int(s: str) -> int:
"""
Преобразование римских цифр в целое число.
Временная сложность: O(n), где n - длина строки
Пространственная сложность: O(1)
"""
roman_map = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000
}
result = 0
prev_value = 0
# Сканирование справа налево
for char in reversed(s):
value = roman_map[char]
if value < prev_value:
result -= value
else:
result += value
prev_value = value
return result
Реализация на JavaScript
Целое в римское
function intToRoman(num) {
const values = [
[1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
[100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
[10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']
];
let result = '';
for (const [value, numeral] of values) {
while (num >= value) {
result += numeral;
num -= value;
}
}
return result;
}
Анализ сложности
Временная сложность
Целое в римское:
- O(1) — Константное время. Алгоритм всегда проходит через 13 пар значений.
Римское в целое:
- O(n) — Линейное время. Каждый символ строки проверяется один раз.
Почему жадный алгоритм работает?
Жадный алгоритм работает для римских цифр, потому что:
- Оптимальная подструктура: Оптимальное решение содержит оптимальные решения подзадач.
- Отсутствие перекрывающихся подзадач: Каждое значение используется независимо.
- Использование максимально возможного значения первым гарантирует кратчайшую запись.
Заключение
Алгоритмы перевода римских цифр демонстрируют мощь жадного подхода. Представленные реализации эффективны, легко читаемы и надежны для стандартного диапазона 1–3999.
Если вам нужен удобный интерфейс без написания кода, попробуйте наш онлайн-конвертер римских цифр с мгновенными результатами.
Хотите узнать больше? Изучите наше полное руководство по чтению римских цифр или посмотрите, как использовать римские цифры в Excel.