Алгоритм: преобразование целого числа в римскую цифру 12. Целое число в римское

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().

おすすめ

転載: blog.csdn.net/zgpeace/article/details/131972463