LeetCode 刷题【12. 整数转罗马数字】

12. 整数转罗马数字

自己做

解:逐步相减

class Solution {
public:
    string intToRoman(int num) {
        string s = "";

        while(num / 1000 > 0){     //能否减1000
            s += 'M';
            num -= 1000;
        }

        while(num / 900 > 0){     //能否减900
            s += "CM";
            num -= 900;
        }

        while(num / 500 > 0){     //能否减500
            s += 'D';
            num -= 500;
        }

        while(num / 400 > 0){     //能否减400
            s += "CD";
            num -= 400;
        }
        
        while(num / 100 > 0){     //能否减100
            s += 'C';
            num -= 100;
        }

        while(num / 90 > 0){     //能否减90
            s += "XC";
            num -= 90;
        }

        while(num / 50 > 0){     //能否减50
            s += 'L';
            num -= 50;
        }

        while(num / 40 > 0){     //能否减40
            s += "XL";
            num -= 40;
        }

        while(num / 10 > 0){     //能否减10
            s += 'X';
            num -= 10;
        }

        while(num / 9 > 0){     //能否减9
            s += "IX";
            num -= 9;
        }

        while(num / 5 > 0){     //能否减5
            s += 'V';
            num -= 5;
        }

        while(num / 4 > 0){     //能否减4
            s += "IV";
            num -= 4;
        }

        while(num > 0){         //剩余的
            s += "I";
            num--;
        }

        return s;
    }
};

看题解

看思路自己敲

class Solution {
public:
    string intToRoman(int num) {
        string s = "";

		vector<vector<string>> v(10, vector<string>(4));            //建立二维数组,存储罗马数字
    
        //最初提供的罗马数字
        v[1][0] = "M";
        v[1][1] = "C";
        v[1][2] = "X";
        v[1][3] = "I";
        
		v[5][1] = "D";
        v[5][2] = "L";
        v[5][3] = "V";

		//建立罗马数字的组合
		v[2][0] = "MM";
        v[2][1] = "CC";
        v[2][2] = "XX";
        v[2][3] = "II";

		v[3][0] = "MMM";
        v[3][1] = "CCC";
        v[3][2] = "XXX";
        v[3][3] = "III";

		v[4][1] = "CD";
        v[4][2] = "XL";
        v[4][3] = "IV";

        v[6][1] = "DC";
        v[6][2] = "LX";
        v[6][3] = "VI";

        v[7][1] = "DCC";
        v[7][2] = "LXX";
        v[7][3] = "VII";

        v[8][1] = "DCCC";
        v[8][2] = "LXXX";
        v[8][3] = "VIII";

        v[9][1] = "CM";
        v[9][2] = "XC";
        v[9][3] = "IX";

        if (num / 1000 > 0) {           //千位
            s += v[num / 1000][0];
            num %= 1000;
        }
            
        if (num / 100 > 0) {            //百位
            s += v[num / 100][1];
            num %= 100;
        }

        if (num / 10 > 0) {             //十位
            s += v[num / 10][2];
            num %= 10;
        }

        if (num > 0) {                  //个位
            s += v[num][3];
        }


        return s;
    }
};

显然浪费时间在输入建立表上了

这次看了官方代码,再来

class Solution {
public:
    string intToRoman(int num) {
		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"};

        return thousands[num / 1000] + hundreds[num / 100 % 10] + tens[num / 10 % 10] + ones[num % 10];
    }
};

还是慢了。。。

官方代码

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、付费专栏及课程。

余额充值