題目
給定一個羅馬數字,将其轉換成整數。
傳回的結果要求在 1 到 3999 的範圍内。
羅馬數字
羅馬數字字母
羅馬數字隻有7個字母組成,每個字母代碼的字如下
字母 | 數字 |
---|---|
M | 1000 |
D | 500 |
C | 100 |
L | 50 |
X | 10 |
V | 5 |
I | 1 |
四個規則
- 相同的數字連寫, 所表示的數等于這些數字相加得到的數。如 XXX表示 30
- 小的數字在大的數字的右邊, 所表示的數等于這些數字相加得到的數 如VIII 表示8
- 小的數字(限于I, X, C)在大的數字的左邊, 所表示的數等于大數減去小的數: 如IV 表示4
- 在一個數的上面畫一條橫線, 表示這個數增值1000倍(由于題目隻考慮4000以内的數,是以這條規則不用考慮)。
五個組數規則
- I, X, C: 最多隻能連用3個, 如果放在大數的左邊,隻能用1個。
- V, L, D: 不能放在大數的左邊,隻能使用一個。
- I 隻能用在V和X的左邊。 IV表示4, IX表示9
- X隻能放在L,C左邊。 XL 表示40, XC表示90
- C隻能用在D, M左邊。 CD 表示400, CM表示900
分析
- 從13個羅馬數字的從大到小依次判斷
- 判斷字元串是否以該羅馬數字開頭
- 取剩餘子串繼續循環
解題
class Solution {
public int romanToInt(String s) {
if(s.length() == ) return ;
int ret = ;
int[] number = {, , , , ,, , , , , , , };
String[] roms = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for(int i = ; i < && s.length() > ; i++){
while(s.startsWith(roms[i])) {
ret += number[i];
s = s.substring(roms[i].length());
}
}
return ret;
}
}
啟示
- 主要是規則,可以記住羅馬數字規則
- 注意邊界值的判斷,如複雜邊界值,可以舉例試驗