11. 盛最多水的容器
链接:https://leetcode-cn.com/problems/integer-to-roman/
题目描述见链接内容。
解法1:高级API
利用了JS的很多高级API,思路就是先把数字按照个位、十位、百位、千位拆成一个数组,然后倒序,从个位开始,通过配置区分区情况,然后再重新组合起来
var intToRoman = function (num) {
const DICT = {
0: {1: 'I', 5: 'V', 10: 'X'},
1: {1: 'X', 5: 'L', 10: 'C'},
2: {1: 'C', 5: 'D', 10: 'M'},
3: {1: 'M'}
};
return num
.toString()
.split('')
.reverse()
.map((v, index) => {
return toRoman(+v, DICT[index]);
})
.reverse()
.join('');
};
function toRoman(num, conf) {
if (num === 0) {
return '';
}
if (num === 9) {
return conf[1] + conf[10];
}
if (num === 4) {
return conf[1] + conf[5];
}
if (num >= 5) {
return conf[5] + conf[1].repeat(num - 5);
}
return conf[1].repeat(num);
}
执行用时:132ms, 在所有JavaScript提交中击败了100%的用户,内存消耗:45.6MB,在所有JavaScript提交中击败了13%用户
解法2:模拟法
还是官方题解给出的解法更简单,给出一个配置,数字总是去匹配配置中最大的那一个,然后用配置中的数字去缩小给定的数字,直到结束
var intToRoman = function (num) {
const DICT = [
[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']
];
let result = '';
for (const [val, str] of DICT) {
while (num >= val) {
num -= val;
result += str;
}
}
return result;
};
- 执行用时:128ms, 在所有JavaScript提交中击败了99.88%的用户,内存消耗:43.5MB,在所有JavaScript提交中击败了82.81%的用户