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,DandM.
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example,
2is written asIIin Roman numeral, just two one's added together.12is written asXII, which is simplyX + II. The number27is 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:
Ican be placed beforeV(5) andX(10) to make4and9.Xcan be placed beforeL(50) andC(100) to make40and90.Ccan be placed beforeD(500) andM(1000) to make400and900.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 ....