This is part of a series of Leetcode solution explanations (index). If you liked this solution or found it useful, please like this post and/or upvote my solution post on Leetcode's forums.
Leetcode Problem #12 (Medium): Integer to Roman
Description:
(Jump to: Solution Idea || Code: JavaScript | Python | Java | C++)
Roman numerals are represented by seven different symbols:
I
,V
,X
,L
,C
,D
andM
.
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example,
2
is written asII
in Roman numeral, just two one's added together.12
is written asXII
, which is simplyX + II
. The number27
is written asXXVII
, which isXX + V + II
.Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not
IIII
. Instead, the number four is written asIV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written asIX
. There are six instances where subtraction is used:
I
can be placed beforeV
(5
) andX
(10
) to make4
and9
.X
can be placed beforeL
(50
) andC
(100
) to make40
and90
.C
can be placed beforeD
(500
) andM
(1000
) to make400
and900
.Given an integer, convert it to a roman numeral.
Examples:
Example 1: Input: num = 3 Output: "III"
Example 2: Input: num = 4 Output: "IV"
Example 3: Input: num = 9 Output: "IX"
Example 4: Input: num = 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
Example 5: Input: num = 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Constraints:
1 <= num <= 3999
Idea:
(Jump to: Problem Description || Code: JavaScript | Python | Java | C++)
Just like Roman to Integer, this problem is most easily solved using a lookup table for the conversion between digit and numeral. In this case, we can easily deal with the values in descending order and insert the appropriate numeral (or numerals) as many times as we can while reducing the our target number (N) by the same amount.
Once N runs out, we can return ans.
Implementation:
Java's StringBuilder can take care of repeated string concatenations without some of the overhead of making string copies.
Javascript Code:
(Jump to: Problem Description || Solution Idea)
const val = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
const rom = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
var intToRoman = function(N) {
let ans = ""
for (let i = 0; N; i++)
while (N >= val[i]) ans += rom[i], N -= val[i]
return ans
};
Python Code:
(Jump to: Problem Description || Solution Idea)
val = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
rom = ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
class Solution:
def intToRoman(self, N: int) -> str:
ans = ""
for i in range(13):
while N >= val[i]:
ans += rom[i]
N -= val[i]
return ans
Java Code:
(Jump to: Problem Description || Solution Idea)
class Solution {
final static int[] val = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
final static String[] rom = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
public String intToRoman(int N) {
StringBuilder ans = new StringBuilder();
for (int i = 0; N > 0; i++)
while (N >= val[i]) {
ans.append(rom[i]);
N -= val[i];
}
return ans.toString();
}
}
C++ Code:
(Jump to: Problem Description || Solution Idea)
class Solution {
public:
const int val[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
const string rom[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string intToRoman(int N) {
string ans = "";
for (int i = 0; N; i++)
while (N >= val[i]) ans += rom[i], N -= val[i];
return ans;
}
};
Top comments (2)
What is the time and space complexity of this algorithm? Thanks
O(13) ?
LOL ....