LeetCode:Integer to Roman

吃可爱长大的小学妹 提交于 2020-03-01 10:14:56

1、题目名称

Integer to Roman (阿拉伯数字到罗马数字的转换)

2、题目地址

https://leetcode.com/problems/integer-to-roman

3、题目内容

英文:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

中文:给出一个整数,将它转换成罗马数字。输入在1-3999之间。

4、题目分析

将阿拉伯数字转换为罗马数字,首先需要了解一下罗马数字的生成规则。罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),它的生成规则较为复杂,具体可以参考维基百科条目:罗马数字(中文英文)。虽然写罗马数字是件比较繁琐的事情,但将十进制数字转换为罗马数字,却有一个简单的规律,可以从下面这张表中看到:

可以看到,与十进制数字相比,虽然在个位、十位、百位、千位这些数位上罗马数字的写法各不相同,但却都有着共同规律。从纵向比较看,每一个数位的写法只和该数位对应的一倍、五倍、十倍对应的字母有关。如8的罗马数字是VIII(5+1+1+1),80是LXXX(50+10+10+10),800是DCCC(500+100+100+100)。因此我们就可以将十进制数字的各位取出,按照罗马数字各数位的字符生成规则,生成对应的罗马数字。

5、解题方法1

按照第四节中的分析,实现代码如下:

/**
 * 功能说明:LeetCode 12 - Integer to Roman
 * 开发人员:Tsybius
 * 开发时间:2015年8月2日
 */
public class Solution {
    
    /**
     * 阿拉伯数字转罗马数字(3999及以下)
     * @param num 被转换的阿拉伯数字
     * @return 转换后的罗马数字
     */
    public String intToRoman(int num) {

        String result = "";

        if (num >= 1000) {
            result += getRomanMultipleOf1000(num - num % 1000);
            num %= 1000;
        }
        if (num >= 100) {
            result += getRomanMultipleOf100(num - num % 100);
            num %= 100;
        }
        if (num >= 10) {
            result += getRomanMultipleOf10(num - num % 10);
            num %= 10;
        }
        
        result += getRomanLowerEqualThan10(num);
        
        return result;
    }
    
    /**
     * 小于10的罗马数字
     * @param num
     * @return
     */
    public String getRomanLowerEqualThan10(int num) {
        switch(num) {
            case 1: return "I";
            case 2: return "II";
            case 3: return "III";
            case 4: return "IV";
            case 5: return "V";
            case 6: return "VI";
            case 7: return "VII";
            case 8: return "VIII";
            case 9: return "IX";
            default: return "";
        }
    }
    
    /**
     * 10的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf10(int num) {
        switch(num) {
            case 10: return "X";
            case 20: return "XX";
            case 30: return "XXX";
            case 40: return "XL";
            case 50: return "L";
            case 60: return "LX";
            case 70: return "LXX";
            case 80: return "LXXX";
            case 90: return "XC";
            default: return "";
        }        
    }
    
    /**
     * 100的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf100(int num) {
        switch(num) {
            case 100: return "C";
            case 200: return "CC";
            case 300: return "CCC";
            case 400: return "CD";
            case 500: return "D";
            case 600: return "DC";
            case 700: return "DCC";
            case 800: return "DCCC";
            case 900: return "CM";
            default: return "";
        }
    }

    /**
     * 1000的倍数
     * @param num
     * @return
     */
    public String getRomanMultipleOf1000(int num) {
        switch(num) {
            case 1000: return "M";
            case 2000: return "MM";
            case 3000: return "MMM";
            default: return "";
        }
    }
}

6、解题方法2

方法1中的代码过于冗长,类似的代码重写了多次,我们可以用数组来缩短代码行数:

/**
 * 功能说明:LeetCode 12 - Integer to Roman
 * 开发人员:Tsybius
 * 开发时间:2015年8月2日
 */
public class Solution {
    
    /**
     * 阿拉伯数字转罗马数字(3999及以下)
     * @param num 被转换的阿拉伯数字
     * @return 转换后的罗马数字
     */
    public String intToRoman(int num) {

        String[][] RomanDict = new String[][] {
            { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" },
            { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" },
            { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" },
            { "", "M", "MM", "MMM", "", "", "", "", "", "", "" },
        };

        return RomanDict[3][num / 1000] + 
            RomanDict[2][num % 1000 / 100] +
            RomanDict[1][num % 100 / 10] +
            RomanDict[0][num % 10];
    }
}

END

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!