题目描述
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。(还是那13种组合)
输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
解题思路
这道题能想到用贪心算法,是来源于生活中的经验。对于这道问题,类似于用最少的纸币凑成一个整数,贪心算法的规则如下:
每一步都使用当前较大的罗马数字作为加法因子,最后得到罗马数字表示就是长度最少的。
参考代码
class Solution {
public:
string intToRoman(int num) {
// 把阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放在两个数组中
// 并且按照阿拉伯数字的大小降序排列,这是贪心选择思想
vector<int> nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
string res = "";
for(int i = 0; i < nums.size(); i++){
// 特别注意:这里是大于等于号,表示尽量使用大的"面值"
while(num >= nums[i]){
res += romans[i];
num -= nums[i];
}
}
return res;
}
};