首页 > 技术文章 > [Leetcode]Integer to Roman&Roman to Integer随记

lilylee 2016-02-26 14:37 原文

No.12, Integer to Roman,将一个int数转换为罗马数字(范围为1-3999)。

No.13, Roman to Integer,将罗马数字转换为int(范围为1-3999)。

这题没什么难度,主要是理解罗马数字的规则。

在罗马数字中:

1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};

100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};

1000~3000: {"M", "MM", "MMM"}

 

第12题只需要将每一位的数字抽出来转换为罗马数字即可。

 public String intToRoman(int num) {
        String result="";
        
        String[][] roman = {  
                {"", "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"}  
            }; 
        int i=0;
        while(num!=0){
            int number=num%10;
            result=roman[i][number]+result;
            i++;
            num/=10;        
        }      
        return result;
    }

当然还有更漂亮的代码

     public static String intToRoman(int num) {
            String M[] = {"", "M", "MM", "MMM"};
            String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
            String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
            String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
            return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10];
        }

 

这道题的解题方法还有很多,例如在罗马数字中,可以拆分为IVXCMD等罗马数字单元来算。

 

第13题,主要是注意IV VI这样的情况即可,如果小数在前说明是减。

public class Solution {
    public int romanToInt(String s) {
        int result=0;
        for(int i=0;i<s.length()-1;i++){
            int n=toNumber(s.charAt(i));
            if(n<toNumber(s.charAt(i+1))){
                result-=n;
            }
            else
                result+=n;
        }
        result+=toNumber(s.charAt(s.length()-1));
        return result;
    }
    public int toNumber(char c){
        switch (c){
            case 'I':return 1;
            case 'V':return 5;
            case 'X':return 10;
            case 'L':return 50;
            case 'C':return 100;
            case 'D':return 500;
            case 'M':return 1000;
        }
        return 0;
    }
}

 

推荐阅读