LeetCode-12. 整数转罗马数字

82 阅读2分钟

12. 整数转罗马数字

难度中等900收藏分享切换为英文接收动态反馈

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

 

示例 1:

输入: num = 3
输出: "III"

示例 2:

输入: num = 4
输出: "IV"

示例 3:

输入: num = 9
输出: "IX"

示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

 

提示:

  • 1 <= num <= 3999

拆分个十百千位数字,分开转换然后合并

const I = 1;
const V = 5;
const X = 10;
const L = 50;
const C = 100;
const D = 500;
const M = 1000;
// num = 1994
// 输出: "MCMXCIV"
function getRomaString(num) {
let t = 1;
let cur = 0;
let curRoma = '';
const res = [];
while (num) {
    cur = (num % 10) * t;
    // 拆分cur
    if (t === 1) {
        // 个位
        if (cur === 9) {
            curRoma = 'IX';
        } else if (cur === 4) {
            curRoma = 'IV';
        } else if (cur >= 5) {
            curRoma = 'V' + new Array(cur - 5).fill('I').join('');
        } else {
            curRoma = new Array(cur).fill('I').join('');
        }
    } else if (t === 10) {
        // 十位
        if (cur === 90) {
            curRoma = 'XC';
        } else if (cur === 40) {
            curRoma = 'XL';
        } else if (cur >= 50) {
            curRoma = 'L' + new Array(cur / t - 5).fill('X').join('');
        } else {
            curRoma = new Array(cur / t).fill('X').join('');
        }
    } else if (t === 100) {
        // 百位
        if (cur === 900) {
            curRoma = 'CM';
        } else if (cur === 400) {
            curRoma = 'CD';
        } else if (cur >= 500) {
            curRoma = 'D' + new Array(cur / t - 5).fill('C').join('');
        } else {
            curRoma = new Array(cur / t).fill('C').join('');
        }
    } else if (t === 1000) {
        // 因为num <= 3999
        curRoma = new Array(cur / t).fill('M').join('');
    }
    res.push(curRoma);

    num = parseInt(num / 10);
    t = t * 10;
}
return res.reverse().join('');
}

console.log(getRomaString(27)) // XXVII
console.log(getRomaString(1994)) // MCMXCIV