Skip to content

Latest commit

 

History

History
106 lines (82 loc) · 4.26 KB

File metadata and controls

106 lines (82 loc) · 4.26 KB

12. Integer to Roman (Medium)

Date and Time: Sep 11, 2024, 0:03 (EST)

Link: https://leetcode.com/problems/integer-to-roman/


Date Stopwatch Y/N Feedback
Jul 6, 2025 20m 59s Y Watched tutorial

Question:

Seven different symbols represent Roman numerals with the following values:

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

Roman numerals are formed by appending the conversions of decimal place values from highest to lowest. Converting a decimal place value into a Roman numeral has the following rules:

  • If the value does not start with 4 or 9, select the symbol of the maximal value that can be subtracted from the input, append that symbol to the result, subtract its value, and convert the remainder to a Roman numeral.

  • If the value starts with 4 or 9 use the subtractive form representing one symbol subtracted from the following symbol, for example, 4 is 1 (I) less than 5 (V): IV and 9 is 1 (I) less than 10 (X): IX. Only the following subtractive forms are used: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) and 900 (CM).

  • Only powers of 10 (I, X, C, M) can be appended consecutively at most 3 times to represent multiples of 10. You cannot append 5 (V), 50 (L), or 500 (D) multiple times. If you need to append a symbol 4 times use the subtractive form.

Given an integer, convert it to a Roman numeral.


Example 1:

Input: num = 3749

Output: "MMMDCCXLIX"

Explanation:
3000 = MMM as 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC as 500 (D) + 100 (C) + 100 (C)
40 = XL as 10 (X) less of 50 (L)
9 = IX as 1 (I) less of 10 (X)
Note: 49 is not 1 (I) less of 50 (L) because the conversion is based on decimal places

Example 2:

Input: num = 58

Output: "LVIII"

Explanation:
50 = L
8 = VIII

Example 3:

Input: num = 1994

Output: "MCMXCIV"

Explanation:
1000 = M
900 = CM
90 = XC
4 = IV


Constraints:

  • 1 <= num <= 3999

Walk-through:

To handle special subtractive form, we just add them into the Roman-Value lists or hashmap. Then, we want to eliminate from the highest decimal place values to the lowest, so we traverse every pair of Roman-Value table from the biggest to the smallest, we use // to know if this current val can eliminate the highest decimal place values and how many this Roman symbol we need to add to res string, then update value of num by num %= val.


Python Solution:

class Solution:
    def intToRoman(self, num: int) -> str:
        # 1. Map symbol with value
        # 2. Always start with the greatest value to divide then update num and append roman to ans""
        # TC: O(1), SC: O(1)

        roman = [['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100], ['XC', 90], ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1]]
        ans = ""
        for sym, digit in roman:
            if num // digit:
                # Append sym with times into ans, and update num
                ans += sym * (num // digit)
                num %= digit
        return ans

Time Complexity: $O(1)$
Space Complexity: $O(1)$


CC BY-NC-SABY: credit must be given to the creatorNC: Only noncommercial uses of the work are permittedSA: Adaptations must be shared under the same terms