LeetCode:Integer to Roman

来源:互联网 发布:利润差额简算法 编辑:程序博客网 时间:2024/06/07 21:01
/**Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.题目大意:把一个整数变成罗马数字,输入数字是1-3999先恶补一下罗马数字相关知识:    最常见的罗马数字就是钟表的表盘符号:        I, II, III, IV(也作IIII), V, VI, VII, VIII, IX, X, XI, XII...    1、基本字符:        1-I,5-V,10-X,50-L,100-C,500-D,1000-M    2、基本规则:        a、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;        b、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;        c、小的数字,(限于I、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;        d、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)        e、在一个数的上面画一条横线,表示这个数扩大1000倍。    3、注意事项:        a、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。        b、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。        c、V 和X 左边的小数字只能用Ⅰ。        d、L 和C 左边的小数字只能用X。        e、D 和M 左边的小数字只能用C。    4、举例:        a、个位数举例            Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】        b、十位数举例            Ⅹ,10】 Ⅺ,11 】ⅫII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XX            XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 LX,60】 LXV,65】 LXXX,80】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】 XCIX,99 】        c、百位数举例            C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】        d、千位数举例            M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】MDCLXVI,1666】 MDCCCLXXXVIII,1888 】MDCCCXCIX,1899 】            MCM,1900 】MCMLXXVI,1976】 MCMLXXXIV,1984】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999】        e、千位数以上            这个时候就要在字幕上面划横线了,纯字符没法表示**/public class Solution {    public String intToRoman(int num) {        //return solve1(num);        return solve2(num);    }        //============================ solve1 ================================    //直接预存储个、十、百、千位所有的值    //如果要说有什么可以改进的话,最后那里形成result的地方别用加号,用StringBuffer或者StringBuilder      private String solve1(int num){        String[] str3 = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};        String[] str2 = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};        String[] str1 = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};        String[] str0 = {"", "M", "MM", "MMM"};                int num0 = num / 1000;        num %= 1000;                int num1 = num / 100;        num %= 100;                int num2 = num / 10;        num %= 10;                int num3 = num;                String result = str0[num0] + str1[num1] + str2[num2] + str3[num3];        return result;    }        //============================ solve2 ================================    //这是另外一种方式,我觉得这两个差不多    //不过使用的字符串少了一些,方法更巧妙了,同样可以使用用StringBuffer或者StringBuilder进行加速    private String solve2(int num){        String result = "";        String[] str = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};          int[] nums={1000,900,500,400,100,90,50,40,10,9,5,4,1};                  int i = 0;        while(num != 0){            if(num >= nums[i]){                num -= nums[i];                result += str[i];            }else{                i++;            }        }                return result;    }}

原创粉丝点击