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
};

results matching ""

    No results matching ""