题目
给定一个罗马数字,将其转换成整数。
返回的结果要求在 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() == 0) return 0;
int ret = 0;
int[] number = {1000, 900, 500, 400, 100,90, 50, 40, 10, 9, 5, 4, 1};
String[] roms = {"M","CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for(int i = 0; i < 13 && s.length() > 0; i++){
while(s.startsWith(roms[i])) {
ret += number[i];
s = s.substring(roms[i].length());
}
}
return ret;
}
}
启示
- 主要是规则,可以记住罗马数字规则
- 注意边界值的判断,如复杂边界值,可以举例试验