[LeetCode] 12、整数转罗马数字

题目描述

给定一个整数,将其转为罗马数字。输入确保在 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;
    }
    
};
发布了402 篇原创文章 · 获赞 588 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/ft_sunshine/article/details/104010617