LeetCode 12 Integer to Roman (Tag:Hash Table Difficulty:Medium)

156 阅读2分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

罗马数字包含以下七种字符: I, V, X, LCD 和 M。给你一个整数,将其转为罗马数字。

image.png 示例 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…

题解

这道题目意思是让我们将数字改写成罗马数字。罗马数字和阿拉伯数字是有对应关系的,如上图所示,除了这几个基础的外,还有几个特殊的:

  1. 4 = IV
  2. 9 = IX
  3. 40 = XL
  4. 90 = XC
  5. 400 = CD
  6. 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
};