个人记录-LeetCode 12. Integer to Roman

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

题目要求将阿拉伯数字转化为罗马数字。
关键在于理解罗马数字的构成规律。

基本字符:
I V X L C D M
相应的阿拉伯数字表示为
1 5 10 50 100 500 1000
对应规则:
相同的数字连写,所表示的数等于这些数字相加得到的数;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数;
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数;
正常使用时、连写的数字重复不得超过三次。

有了以上基本知识后,我们就比较容易写出对应的转换代码。

代码示例:

public class Solution {
    public String intToRoman(int num) {
        //得到千位
        int thousand = num / 1000;
        num = num - thousand * 1000;

        //得到百位
        int hundred = num / 100;
        num = num - hundred * 100;

        //得到十位
        int decade = num / 10;

        //得到个位
        int unit = num - decade * 10;

        StringBuilder result = new StringBuilder("");

        while (thousand > 0) {
            result.append("M");
            --thousand;
        }

        //convert第一参数表示当前位的数字
        //每一位的数字分为这么几类9,6~8,5,4,1~3
        //9用高位减低位得到,例如900为CM
        //6~8用分界位加低位得到,例如600为DC
        //5就是分界位,例如500为D
        //4用分界位减低位得到,例如400为CD
        //1~3用低位累加得到,例如300为CCC
        result.append(convert(hundred, "M", "D", "C"));

        //类似
        result.append(convert(decade, "C", "L", "X"));

        //类似
        result.append(convert(unit, "X", "V", "I"));

        return result.toString();
    }

    private String convert(int num, String high, String divide, String low) {
        StringBuilder result = new StringBuilder("");

        if (num == 9) {
            result.append(low);
            result.append(high);
        } else if (num >= 5){
            result.append(divide);
            while (num > 5) {
                result.append(low);
                num--;
            }
        } else if (num == 4){
            result.append(low);
            result.append(divide);
        } else {
            while (num > 0) {
                result.append(low);
                num--;
            }
        }

        return result.toString();
    }
}

你可能感兴趣的:(个人记录-LeetCode 12. Integer to Roman)