LeetCode:Integer to Roman - 阿拉伯數字到羅馬數字的轉換

一、題目名稱java

Integer to Roman (阿拉伯數字到羅馬數字的轉換)數組

二、題目地址code

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

三、題目內容leetcode

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

中文:給出一個整數,將它轉換成羅馬數字。輸入在1-3999之間。get

四、題目分析it

將阿拉伯數字轉換爲羅馬數字,首先須要瞭解一下羅馬數字的生成規則。羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),它的生成規則較爲複雜,具體能夠參考維基百科條目:羅馬數字(中文英文)。雖然寫羅馬數字是件比較繁瑣的事情,但將十進制數字轉換爲羅馬數字,卻有一個簡單的規律,能夠從下面這張表中看到:io

能夠看到,與十進制數字相比,雖然在個位、十位、百位、千位這些數位上羅馬數字的寫法各不相同,但卻都有着共同規律。從縱向比較看,每個數位的寫法只和該數位對應的一倍、五倍、十倍對應的字母有關。如8的羅馬數字是VIII(5+1+1+1),80是LXXX(50+10+10+10),800是DCCC(500+100+100+100)。所以咱們就能夠將十進制數字的各位取出,按照羅馬數字各數位的字符生成規則,生成對應的羅馬數字。class

五、解題方法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 "";
        }
    }
}

六、解題方法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

相關文章
相關標籤/搜索