我現在在做一個叫《leetbook》的開源書項目,把解題思路都同步更新到github上了,需要的同學可以去看看
地址:https://github.com/hk029/leetcode
這個是書的地址:https://hk029.gitbooks.io/leetbook/
這里寫圖片描述
- Integer to Roman[M]
問題
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
思路
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1,000 |
分析羅馬數字的規律:
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1,000 |
上面是羅馬數字所有的符號。
羅馬數字的規則:
一般情況下,從左到右從大到小排,字母代表的數字累加。
比如:
XII = 12
MDCCLXVI= 1000+500+100+100+50+10+5+1
但是有特殊情況,就是,如果數字的范圍在大數減小數的范圍內,則會出現小數在大數前面的情況,代表(大數-小數)
IV = 5-1
IX= 10 - 1 = 9
XL = 50-10 = 40
Symbol | Value |
---|---|
IV | 4 |
IX | 9 |
XL | 40 |
XC | 90 |
CD | 400 |
CM | 900 |
思路1——循環
一旦把所有可能的情況符號情況都列舉出來了,就好做了。
我們現在拿到一個數N
- 我們就去表里面找不超過它的最大的數x,
- 然后把它入我們的輸出字符串中,然后將數N-=x,
- 繼續執行這個操作,直到N=0
public class Solution {
public String intToRoman(int num) {
int list[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String chars[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int i = 0;
String out="";
while(num > 0)
{
for(;i < list.length;i++)
if(num >= list[i])
break;
out+=chars[i];
num -= list[i];
}
return out;
}
}
思路2——查表
還有個更極端的方案,就是,把每位上可能出現的情況都列舉出來,剩下的,只用查表就行了。
public class Solution {
public static 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];
}
}