12. 整数转罗马数字

题目:

 

 

 

 

 

 

思路:

【1】映射表+模拟数值计算生成

【2】硬编码数字

代码展示:

映射表+模拟数值计算生成:

//时间4 ms击败41.68%
//内存40.9 MB击败81.71%
//时间复杂度:O(1)。由于 映射表 长度是固定的,且这 13字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过 15 次。
//空间复杂度:O(1)。
class Solution {
    public String intToRoman(int num) {
        //构建映射表
        int[] val = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] str = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < val.length && num > 0; i++) {
            int n = val[i];
            while (num >= n){
                buf.append(str[i]);
                num -= n;
            }
        }
        return buf.toString();
    }
}

硬编码数字:

//时间3 ms击败97.41%
//内存41.4 MB击败28.74%
//时间复杂度:O(1)。计算量与输入数字的大小无关。
//空间复杂度:O(1)。
class Solution {
    public String intToRoman(int num) {
        String[] thousands = {"", "M", "MM", "MMM"};
        String[] hundreds  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String[] tens      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        String[] ones      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

        StringBuffer roman = new StringBuffer();
        roman.append(thousands[num / 1000]);
        roman.append(hundreds[num % 1000 / 100]);
        roman.append(tens[num % 100 / 10]);
        roman.append(ones[num % 10]);
        return roman.toString();
    }
}

 

posted @ 2023-02-03 15:30  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报