整數轉換爲羅馬數字 Integer to Roman

問題:算法

Given an integer, convert it to a roman numeral.數組

Input is guaranteed to be within the range from 1 to 3999.app

解決:ui

【注】spa

基本字符it

Iio

Vtable

Xclass

L遍歷

C

D

M

相應的阿拉伯數字表示爲

1

5

10

50

100

500

1000

例如整數 1437 的羅馬數字爲 MCDXXXVII, 咱們不難發現,千位,百位,十位和個位上的數分別用羅馬數字表示了。 1000 - M, 400 - CD, 30 - XXX, 7 - VII。因此咱們要作的就是用取商法分別提取各個位上的數字,而後分別表示出來:
【羅馬數字】
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"}.

設數字與羅馬數字之間的對應關係:roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
以100~900爲例,咱們能夠分爲四類:100到300一類res += roman[n],400一類res += roman[n]+roman[n-1],500到800一類res += roman[n - 1] + roman[n],900最後一類res+=roman[n] + roman[n-2]。每一位上的狀況都是相似的,代碼以下:

① 使用代碼實現轉換。

class Solution { //91ms
    public static String intToRoman(int num) {
        String res = "";
        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){//遍歷roman數組
            int val = num / value[i];
            if (val < 4){
                for (int j = 1;j <= val;j ++){
                    res = res + roman[i];
                }
            }else if(val == 4){
                res = res + roman[i] + roman[i - 1];
            }else if (val > 4 && val < 9){
                res = res + roman[i - 1];
                for (int j = 6;j <= val;j ++){
                    res += roman[i];
                }
            }else if (val == 9){
                res = res + roman[i] + roman[i - 2];//若使用res += res + roman[i] + roman[i - 2]結果爲161,變爲了整數相加
            }
            num %= value[i];
        }
        return res;
    }
}

② 本題因爲限制了輸入數字範圍這一特殊性,故而還有一種利用貪心算法的解法,創建一個數表,每次經過查表找出當前最大的數,減去再繼續查表。

public class Solution { //93ms
    private static final String[] ROMAN = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    private static final int[] INTEGERS = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        while (num > 0) {
            while (num >= INTEGERS[index]) {
                sb.append(ROMAN[index]);
                num -= INTEGERS[index];
            }
            index ++;
        }
        return sb.toString();
    }
}

③一種討巧的作法,將全部的可能都列出來。

public class Solution {//95ms     public 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];     } }

相關文章
相關標籤/搜索