这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。给你一个整数,将其转为罗马数字。
示例 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.
链接:leetcode-cn.com/problems/in…
题解
这道题目意思是让我们将数字改写成罗马数字。罗马数字和阿拉伯数字是有对应关系的,如上图所示,除了这几个基础的外,还有几个特殊的:
- 4 = IV
- 9 = IX
- 40 = XL
- 90 = XC
- 400 = CD
- 900 = CM 这些就是所有数字的对应关系了。
当我们在转换时,我们可以按照一种贪心的策略,每次都尽可能匹配最大的罗马数字。为了实现这个策略,我们可以将阿拉伯数字和罗马数字的对应关系按照递减的方式排列。在匹配时,从最大的罗马数字开始匹配,当没有合适的数字时再去匹配更小的数字,这样就做到了贪心的想法。
具体实现见如下代码。
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function(num) {
// 阿拉伯数字和罗马数字对应关系
const m = [
[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 index = 0
let ans = ''
// 贪心的递减
while (num > 0) {
if (num >= m[index][0]) {
ans += m[index][1]
num -= m[index][0]
} else {
index += 1
}
}
return ans
};