問題:算法
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]; } }