一. 题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
二. 罗马数字学习 https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
二. 罗马数字学习 https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97
I--->1 V--->5 X--->10 L---->50 C---->100 D--->500 M--->1000
1> 罗马数字中没有0;
2>左减右加
左减有限制的:
仅限于I、X、C。比如45不可以写成VL,只能是XLV;
左减时不可跨越一个位数, 比如,99不可以用IC()表示,而是用XCIX()表示;
999不能写成IM(1000-1)表示,而是用CMXCIX( [1000-100] + [100-10] +[10-1] )表示;
左减数字必须为一位,比如8写成VIII,而非IIX。
3>数码限制: 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。
三. 代码
public class Solution {
public int romanToInt(String s) {
//首先保证s肯定是有字符串存在的
if(s==null || s.length()<=0 || s.trim().length()<=0)
return 0;
int res = 0;
int data;
char ch;
for(int i=0; i< s.length(); i++){
ch = s.charAt(i);
switch(s.charAt(i)){
case 'I':
//当I的右边是V或X是才进行减操作,否则进行加,减1的源码是因为每次要和后面相邻的字符进行比较/
if(i< s.length()-1 && (s.charAt(i+1)=='V' || s.charAt(i+1)=='X')){
res-=1;
}else
res+=1; //如果最后一位等于I,则这里也进行了处理+1.
break;
case 'V':
if(i< s.length()){ //注意这里比较上面没有-1操作
res+=5;
}
break;
case 'X':
if(i< s.length()-1&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C')){
res-=10;
}else
res+=10;
break;
case 'L':
if(i< s.length()){
res+=50;
}
break;
case 'C':
if(i< s.length()-1 &&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M')){
res-=100;
}else
res+=100;
break;
case 'D':
if(i< s.length())
res+=500;
break;
case 'M':
if(i< s.length())
res+=1000;
break;
default: //保证代码的完整性,万一不是这些字母呢,是吧。
return 0;
}
}
return res;
}
}