leetcode:整数转罗马数字
2021-09-24 本文已影响0人
隔壁老王z
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

例如, 罗马数字 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。
给你一个整数,将其转为罗马数字。
较好的解法:贪心算法,尽可能优先使用较大数值对应的字符,就像购物时找零钱尽可能找大些的面额。本题中,将哈希表按照从大到小的顺序排列,然后遍历哈希表,直到表示完整个输入。
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
const valueSymbols = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]];
const roman = [];
for (const [value, symbol] of valueSymbols) {
debugger
while (num >= value) {
num -= value;
roman.push(symbol);
}
if (num == 0) {
break;
}
}
return roman.join('');
};
比较笨的解法,遍历个十百千每一位,根据情况分别处理:
/**
* @param {number} num
* @return {string}
*/
String.prototype.repeat = function (i) {
return new Array(i + 1).join(this)
}
function intToRoman(num) {
const l1 = num % 1000
const l2 = l1 % 100
const l3 = l2 % 10
const t1 = Math.floor(num / 1000)
const t2 = Math.floor(l1 / 100)
const t3 = Math.floor(l2 / 10)
let res = ''
if (t1) {
res += 'M'.repeat(t1)
}
if (t2) {
if(t2 === 4) {
res += 'CD'
}
if(t2 === 9) {
res += 'CM'
}
if(t2 === 5) {
res += 'D'
}
if(t2 !== 4 && t2 < 5) {
res += 'C'.repeat(t2)
}
if(t2 !== 9 && t2 > 5) {
res += 'D' + 'C'.repeat(t2 - 5)
}
}
if (t3) {
if(t3 === 4) {
res += 'XL'
}
if(t3 === 9) {
res += 'XC'
}
if(t3 === 5) {
res += 'L'
}
if(t3 !== 4 && t3 < 5) {
res += 'X'.repeat(t3)
}
if(t3 !== 9 && t3 > 5) {
res += 'L' + 'X'.repeat(t3 - 5)
}
}
if(l3) {
if(l3 === 4) {
res += 'IV'
}
if(l3 === 9) {
res += 'IX'
}
if(l3 === 5) {
res += 'V'
}
if(l3 !== 4 && l3 < 5) {
res += 'I'.repeat(l3)
}
if(l3 !== 9 && l3 > 5) {
res += 'V' + 'I'.repeat(l3 - 5)
}
}
return res
};