12 Integer to Roman

输入为数字,转换为罗马字符

L: 50 C: 100 D: 500 M: 1000

数字范围: 1-3999

40:ⅠL

差不多这个感觉。

 

思路:通过求余数获得数字的每一位,然后根据位数转换为罗马数字

class Solution {
        
public:
    string convert(int num, string one, string five, string ten){
        if(num == 9) return one+ten;
        
        if( num < 9&&num > 5){
            cout <<  five+convert(num-5, one,five, ten)<< endl;
            return five+convert(num-5, one,five, ten);}
        if(num == 5) return five;
        if(num == 4) return one+five;
        string returnStr;
        for(int i = 0; i<num; i++)
            returnStr += one;
        return returnStr;
    }
    
     string convert(int len, int num){
        string roman;
        switch(len){
            case 1:
                roman = convert(num, "I", "V", "X");
                break;
            case 2:
                roman = convert(num, "X", "L", "C");
                break;
            case 3:
                roman = convert(num, "C", "D", "M");
                break;
            case 4:
                roman = convert(num, "M", " ", " ");
                break;
        }
        return roman;
    }
    
    
    
    string intToRoman(int num) {
        string roman = "";
        int i = 1;
        while(num){
            roman = convert(i, num%10)+roman;
            num/= 10;
            i++;
        }
        return roman;
    }    
};

执行用时 : 96 ms, 在Integer to Roman的C++提交中击败了4.24% 的用户

内存消耗 : 30.8 MB, 在Integer to Roman的C++提交中击败了0.85% 的用户

没啥好说的,写的很复杂。尽可能的想把规则模拟出来,而不是解决这个问题。

 

看别人怎么写的:

解法1:

class Solution {
public:
    string intToRoman(int num) {
        int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
        string reps[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        
        string response;
        for(int i = 0;i<13;i++)
        {
            while(num>=values[i])//循环保证可以处理多次需要同样的罗马数字,如:XX二十
            {
                num -= values[i];
                response += reps[i];
            }
        }
        return response;
    }
};

执行用时 : 112 ms, 在Integer to Roman的C++提交中击败了0.85% 的用户

内存消耗 : 30.8 MB, 在Integer to Roman的C++提交中击败了0.85% 的用户

nmdwsm 说好的28s执行范例呢?难道这还跟本地pc有关系吗

确实很简单,不过没有考虑更多的数,也就是只有有限性。不具有良好的扩展性。

从高位到低位,减去所能用到的,然后最后得到字符串,思路十分清晰。

 

看别人怎么写的解法2:

class Solution:
    def intToRoman(self, num):
        m = [
            ['', 'M', 'MM', 'MMM'],
            ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
            ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
            ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']
        ]
        d = [1000, 100, 10, 1]
        r = ''
        for k, v in enumerate(d):
            r += m[k][int(num/v)]
            num = num % v
        return r

执行用时 : 88 ms, 在Integer to Roman的Python提交中击败了59.13% 的用户

内存消耗 : 10.7 MB, 在Integer to Roman的Python提交中击败了0.00% 的用户

 

这个。。好像更加有局限性吧,不过身为python,运行比c++快,也是说明了确实好用。

但是。。从0到10每个列出来。。。我佛了。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值