12. Целое число в римское
Римские цифры представлены семью различными символами: I, V, X, L, C, D и M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Например, 2 записывается как II римскими цифрами, просто две единицы складываются вместе. 12 записывается как XII, то есть просто X + II. Число 27 записывается как XXVII, то есть XX + V + II
.
Римские цифры обычно пишутся слева направо от большего к меньшему. Однако цифра четыре не IIII. Вместо этого цифра четыре пишется как IV. Поскольку единица предшествует пятерке, мы вычитаем ее и получаем четыре. Тот же принцип применим к числу девять, которое пишется как IX. Есть шесть случаев, когда используется вычитание:
- I можно поставить перед V (5) и X (10), чтобы получились 4 и 9.
- X можно поставить перед L (50) и C (100), чтобы получилось 40 и 90.
- C можно поставить перед D (500) и M (1000), чтобы получились 400 и 900.
Дано целое число, преобразовать его в римскую цифру.
Пример 1:
Input: num = 3
Output: "III"
Explanation: 3 is represented as 3 ones.
Пример 2:
Input: num = 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.
Пример 3:
Input: num = 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Ограничения:
- 1 <= число <= 3999
решение для обхода словаря
class Solution:
def intToRoman(self, num: int) -> str:
# 定义字典,映射罗马字符和对应的值
dic = {
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'}
# 初始化结果列表
res = []
# 遍历字典中的每个值-符号对
for value, symbol in dic.items():
# 如果num为0,跳出循环
if num == 0:
break
# 用当前的value去除num,并获取商和余数
# 商表示当前value可以完全覆盖num的次数,余数表示剩余的部分
count, num = divmod(num, value)
# 将当前的符号重复count次,并添加到结果列表
res.append(symbol * count)
# 将结果列表中的字符串连接起来,返回
return ''.join(res)
Анализ сложности выглядит следующим образом:
Временная сложность: нам нужно только один раз просмотреть словарь символов для римских цифр, который содержит 13 элементов. Таким образом, временная сложность O (1). Хотя мы выполняем операции умножения и объединения строк на каждой итерации, сложность обеих операций составляет O(k), где k — количество повторений. Но в целом максимальное значение k невелико (максимум равен 3, что соответствует «III», «XXX», «ССС», «МММ»), поэтому временную сложность можно считать постоянной.
Сложность пространства: мы использовали словарь фиксированного размера и список результатов. Длина результирующего списка не превышает 15 (учитывая число 1994, соответствующая римская цифра "MCMXCIV" имеет длину 7), поэтому пространственная сложность также равна O (1).
Метод join() в Python
Метод join() в Python — это строковый метод, который используется для соединения элементов последовательности с определенными символами для создания новой строки.
В коде ''.join(res) метод join() используется для соединения элементов в последовательности res, где '' (пустая строка) представляет соединяемые символы. То есть этот метод объединяет все элементы в списке res без каких-либо символов между ними.
Предположим, у нас есть следующий список:
res = ['M', 'CM', 'XC', 'IV']
Если мы выполним ''.join(res), мы получим:
'MCMXCIV'
Метод join() — очень полезный инструмент, особенно когда нам нужно объединить список строк в одну строку. Это более эффективно, чем объединение строк с помощью оператора +, особенно при работе с большими списками строк.
divmod() — это встроенная функция Python.
divmod() — это встроенная функция Python для выполнения деления и модуля за один раз. Он принимает два аргумента: делимое и делитель и возвращает кортеж, в котором первый элемент является частным, а второй элемент — остатком.
Вот простой пример:
quotient, remainder = divmod(10, 3)
print("Quotient: ", quotient) # 输出:Quotient: 3
print("Remainder: ", remainder) # 输出:Remainder: 1
В этом примере мы используем функцию divmod(), чтобы разделить 10 на 3 и получить частное 3 с остатком 1. Функция divmod() возвращает кортеж (3, 1), мы распаковываем кортеж и присваиваем частное и остаток к частному и остатку соответственно.
Использование функции divmod() более эффективно, чем использование операторов деления и деления по модулю по отдельности, поскольку она выполняет только одну операцию деления. Если вам нужно получить как частное, так и остаток в коде, который вы пишете, то хорошим выбором будет использование функции divmod().