12. Integer to Roman
Problem
https://leetcode.com/problems/integer-to-roman/
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Solution
| Symbol | Value |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1,000 |
| Notation | Number |
|---|---|
| IV | 4 |
| IX | 9 |
| XL | 40 |
| XC | 90 |
| CD | 400 |
| CM | 900 |
Solution1
Hardcoded
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
if (num < 1 || num > 3999) { return '' }
let numStr = '' + num
let len = numStr.length
let result = ''
switch (numStr[len-4]) {
case '1': result += 'M'; break
case '2': result += 'MM'; break
case '3': result += 'MMM'; break
default: break
}
switch (numStr[len-3]) {
case '1': result += 'C'; break
case '2': result += 'CC'; break
case '3': result += 'CCC'; break
case '4': result += 'CD'; break
case '5': result += 'D'; break
case '6': result += 'DC'; break
case '7': result += 'DCC'; break
case '8': result += 'DCCC'; break
case '9': result += 'CM'; break
default: break
}
switch (numStr[len-2]) {
case '1': result += 'X'; break
case '2': result += 'XX'; break
case '3': result += 'XXX'; break
case '4': result += 'XL'; break
case '5': result += 'L'; break
case '6': result += 'LX'; break
case '7': result += 'LXX'; break
case '8': result += 'LXXX'; break
case '9': result += 'XC'; break
default: break
}
switch (numStr[len-1]) {
case '1': result += 'I'; break
case '2': result += 'II'; break
case '3': result += 'III'; break
case '4': result += 'IV'; break
case '5': result += 'V'; break
case '6': result += 'VI'; break
case '7': result += 'VII'; break
case '8': result += 'VIII'; break
case '9': result += 'IX'; break
default: break
}
return result
};
Solution2
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
if (num < 1 || num > 3999) { return '' }
let numStr = '' + num
let len = numStr.length
let result = ''
let roman = [
null, // zero
['I', 'V', 'X'], // units
['X', 'L', 'C'], // tens
['C', 'D', 'M'], // hundreds
['M'] // thousands
]
for (let i = 4; i > 0; i -= 1) {
let digit = Number(numStr[len-i])
if (!isNaN(digit)) {
if (digit === 4 || digit === 9) {
let d = digit === 4? 1 : 2
result += roman[i][0] + roman[i][d]
} else {
if (digit > 3) {
result += roman[i][1]
digit -= 5
}
while (digit > 0) {
result += roman[i][0]
digit -= 1
}
}
}
}
return result
};