Integer to Roman 418

Question

Given an integer, convert it to a roman numeral.

The number is guaranteed to be within the range from 1 to 3999.

Example

4 -> IV

12 -> XII

21 -> XXI

99 -> XCIX

Solution

与Roman to Integer类似,这题是阿拉伯数字与罗马数字转换,用两个一一对应的array来分别存储罗马数字和阿拉伯数字。

根据转化的规则,从前往后遍历数字的每一位,讨论4种情况即可:

M位千位对应的罗马数字,C为百位对应的罗马数字,X为十位对应的罗马数字,I位个位对应的罗马数字

  1. 如果当前位数字v<4,则说明该位对应的罗马数字重复出现v次

  2. 如果当前位数字v=4,则说明对应的罗马数字由当前位对应的罗马数字和其前一位罗马数字组成(如IV)

  3. 如果当前位数字v>4 && v < 9,则说明对应的罗马数字由其前一位罗马数字和(v-5)个当前位对应的罗马数字组成(如VI)

  4. 如果当前位数字v=9,则说明该位对应的罗马数字由当前位和其前二位罗马数字组成(如IX)

代码如下:

public class Solution {
    /**
     * @param n The integer
     * @return Roman representation
     */
    public String intToRoman(int n) {
        // Write your code here
        String res = "";
        if(n < 1){
            return res;
        }
        //M位千位对应的罗马数字,C为百位对应的罗马数字,X为十位对应的罗马数字,I位个位对应的罗马数字
        char[] roman = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
        int[] value = {1000, 500, 100, 50, 10, 5, 1};

        for(int i = 0; i < 7; i += 2){
            int v = n / value[i];
            if(v < 4){
                for(int j = 1; j <= v; j++){
                    res += roman[i];
                }
            }else if(v == 4){
                res = res + roman[i] + roman[i - 1];
            }else if(v > 4 && v < 9){
                res += roman[i - 1];
                for(int j = 6; j <= v; j++){
                    res += roman[i];
                }
            }else if(v == 9){
                res = res + roman[i] + roman[i - 2];
            }
            n %= value[i];
        }

        return res;
    }
}

results matching ""

    No results matching ""