【LeetCode-中等】12. 整数转罗马数字

12. 整数转罗马数字


解法:
高端的食材往往只需要采用最朴素的烹饪方式 (doge)

class Solution {
public:
    string intToRoman(int num) {
        string ans="";
        while(num > 0){
            if(num >= 1000){
                num -= 1000;
                ans += "M";
            }else if(num >= 900){
                num -= 900;
                ans += "CM";
            }else if(num >= 500){
                num -= 500;
                ans += "D";
            }else if(num >= 400){
                num -= 400;
                ans += "CD";
            }else if(num >= 100){
                num -= 100;
                ans += "C";
            }else if(num >= 90){
                num -= 90;
                ans += "XC";
            }else if(num >= 50){
                num -= 50;
                ans += "L";
            }else if(num >= 40){
                num -= 40;
                ans += "XL";
            }else if(num >= 10){
                num -= 10;
                ans += "X";
            }else if(num >= 9){
                num -= 9;
                ans += "IX";
            }else if(num >= 5){
                num -= 5;
                ans += "V";
            }else if(num >= 4){
                num -= 4;
                ans += "IV";
            }else if(num >= 1){
                num -= 1;
                ans += "I";
            }
        }
        return ans;
    }
};

题解也很硬核:
第一种方法用了pair,思路一样,代码更简洁

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;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-by-leetcod-75rs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第二种方法把个、十、百、千对应的都列出来了
个:0,1,2,3,4,5,6,7,8,9
十:0,10,20,30,40,50,60,70,80,90
百:0,100,200,300,400,500,600,700,800,900
千:0,1000,2000,3000
num最大只到3999,所以千列到3000就可以了

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];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值