LeetCode || Integer to Roman

第一种方法:
只需要28ms,但是是简单的罗列,代码量比较大;

class Solution {
public:
    string intToRoman(int num) {
        char c[1000];
        int pos = 0;
        if(num >= 1000)
        {
            for(int i = 0;i<num/1000;i++)
                c[pos++] = 'M';
            num %= 1000;
        }

        //num [0, 999]
        if(num >= 900)
        {
            c[pos++] = 'C';
            c[pos++] = 'M';
            num -= 900;
        }
        
        //num [0, 899]
        if(num >= 500)
        {
            c[pos++] = 'D';
            num -= 500;
        }
        
        //num [0 - 499]
        if(num >= 400)
        {
            c[pos++] = 'C';
            c[pos++] = 'D';
            num -= 400;
        }
        
        //num [0, 399]
        if(num >= 100)
        {
            for(int i = 0;i<num / 100;i++)
            {
                c[pos++] = 'C';
            }
            num %= 100;
        }
        
        //0-99
        if(num >= 90)
        {
            c[pos++] = 'X';
            c[pos++] = 'C';
            num -= 90;
        }
        
        //0-89
        if(num >= 50)
        {
            c[pos++] = 'L';
            num -= 50;
        }
        
        //0 - 49
        if(num >= 40)
        {
            c[pos++] = 'X';
            c[pos++] = 'L';
            num -= 40;
        }
        
        //0, 39
        if(num >= 10)
        {
            for(int i = 0;i<num /10;i++)
            {
                c[pos++] = 'X';
            }
            num = num % 10;
        }
        
        //0, 9
        if(num == 9)
        {
            c[pos++] = 'I';
            c[pos++] = 'X';
            num = 0;
        }
        
        //0 - 8
        if(num >= 5)
        {
            c[pos++] = 'V';
            num -= 5;
        }
        
        //0, 4
        if(num == 4)
        {
            c[pos++] = 'I';
            c[pos++] = 'V';
            num = 0;
        }
        
        //0 - 3
        if(num > 0)
        {
            for(int i = 0;i<num;i++)
                c[pos++] = 'I';
        }
        
        c[pos] = '\0';
        string str(c);
        return str;
    }
};



第二种方法:

对代码进行了整理,代码量少,但是耗时36ms,因为每次都需要从1000开始判断不断循环。

class Solution {
public:
    string intToRoman(int num) {
        
        //M      D    C    L   X   V I 
        //1000   500  100  50  10  5 1
        
        int  RomanNum[10] = {1000,  500,   100,   50,   10,   5,   1};
        char RomanC[10]   = {'M',   'D',   'C',   'L',  'X', 'V', 'I'};
        int start = 0;
        
        int Sub[10]       = {100, 100,  10, 10,   1,   1};
        char SubRoman[10] = {'C', 'C', 'X', 'X', 'I', 'I'};
        int SubStart = -1;//取值为1000的时候不需要检测
        
        char c[1000];
        int pos = 0;

        while(num != 0)
        {
            if(num >= RomanNum[start]) //500
            {
                if(start >= 1 &&num  >= RomanNum[start-1] - Sub[SubStart]) // 1000 - 100
                {
                    c[pos++] = SubRoman[SubStart];
                    c[pos++] = RomanC[start-1];
                    num -= (RomanNum[start-1] - Sub[SubStart]);
                }
                for(int i = 0;i<num / RomanNum[start];i++)
                {
                    c[pos++] = RomanC[start];
                }
                num %= RomanNum[start];
            }
            start++;
            SubStart++;
        }
        
        c[pos] = '\0';
        string str(c);
        return str;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值