LeetCode 12 整数转罗马数字[硬编码 数学 找规律] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 12 整数转罗马数字[硬编码 数学 找规律] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
在这里插入图片描述
解题思路:
一道非常好的逻辑推理题,可以发现,大的数永远在左边,那么就可以想到一种方法,就是首先把这些字符按照从大到小的方式排序,对要转换的数进行遍历,构建一个字符串,每次减去所能减去最大的字符的值,并让字符串+该字符,直到数组为0,代码如下:

const pair<int, string> 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"},
};

class Solution {
public:
    string intToRoman(int num) {
        string roman;
        for (const auto &[value, symbol] : valueSymbols) {
            while (num >= value) {
                num -= value;
                roman += symbol;
            }
            if (num == 0) {
                break;
            }
        }
        return roman;
    }
};

当然还有硬编码的形式,就是用特别暴力的方式把所有的位数上的字符按照区间进行归类,0-9,10-99,100-900,1000以上,四个区间,我们要转换的数就是由这四个区间的值加起来的,代码如下:

const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

class Solution {
public:
    string intToRoman(int num) {
        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }
};

以上是关于LeetCode 12 整数转罗马数字[硬编码 数学 找规律] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(12. 整数转罗马数字)

LeetCode-013-罗马数字转整数

LeetCode-012-整数转罗马数字

每日算法/刷穿 LeetCode12. 整数转罗马数字(中等)

Leetcode#13. Roman to Integer(罗马数字转整数)

leetcode 简单题 13. 罗马数字转整数