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之路的主要内容,如果未能解决你的问题,请参考以下文章
每日算法/刷穿 LeetCode12. 整数转罗马数字(中等)