Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
/** 题目分析:本题要求输入一组只含有罗马数字的字符串,将字符串转换成阿拉伯数字(范围是1~3999)。*/
/** 罗马数字——阿拉伯数字对照表 */
Ⅰ | 1 | XX | 20 |
Ⅱ | 2 | XL | 40 |
Ⅲ | 3 | L | 50 |
Ⅳ | 4 | LC | 90 |
Ⅴ | 5 | C | 100 |
Ⅵ | 6 | CL | 110 |
Ⅶ | 7 | CD | 400 |
Ⅷ | 8 | D | 500 |
Ⅸ | 9 | DC | 600 |
Ⅹ | 10 | M | 1000 |
/** 代码思路:了解了罗马数字辨识之后,回归题目本身。我们输入的是字符串,因为罗马数字从右开始读,所以代码需要先读取字符串中最后一个字符,后再依次向前读取,直至所有字符读取完毕;每次提取的字符与上一次提取的字符进行比较,通过比较来判断运算符号。 */
//toNumber是将基础罗马数字字符Ⅰ,V,X,L,C,M转换成相应的阿拉伯数字;
int toNumber(char c){
switch(c){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
}
return 0;
}
int romanToInt(char s[]) {
int len, i, ret=0;
len = strlen(s); //变量len表示输入的罗马数字字符长度;
if(s == 0) return 0; //如果输入的字符长度是0,那么返回阿拉伯数字0;
ret = toNumber(s[len-1]); //将字符串最后一个字符对应的数字赋给ret,即表示了罗马数字从最右边开始读;
for(i=len-1; i>0; i--){ //for循环,计数器i不断变小,表示了罗马数字不断向左读;
if(toNumber(s[i-1]) >= toNumber(s[i])) //if判断语句,判断左边数字与右边数字的大小关系,从而确定运算符号;
ret += toNumber(s[i-1]);
else
ret -= toNumber(s[i-1]);
}
return ret; //返回结果ret;
}
// LeetCode运行时间:50ms±5ms;