Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
题目要求将给定的罗马字符串转化成整数。
罗 数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。
右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。
如MCIICD = 1500,从右向左读,如果对于某个单词对应的数字,一直减去其前面的连续递减的字符对应的数字,则会拿D-C-I,直到遇到C大于I.
注意在代码实现的过程中,要注意循环不能越界或出界。
/*
* 大数左边加上小数就是把大数减去这个小数.I(1),V(5),X(10),L(50),C(100),D(500),M(1000)
* 如MCIICD = 1500,从右向左读,如果对于某个单词对应的数字,一直减去其前面的连续递减的字符对应的数字,则会拿D-C-I,直到遇到C大于I.
*
*/
public int romanToInt(String s) {
int result = 0;
char[] cArr = s.toCharArray();
int len = cArr.length;
for(int i = len-1;i>=0;){
/*找到目前的字符代表的数字*/
System.out.println(i);
int num = char2Int(cArr[i]);
i--;
result = result + num;
/*找到前面依次递减的字符,都让目前的结果减去这个字符表示的值*/
while(i>=0 && char2Int(cArr[i])<num){
num = char2Int(cArr[i]);
System.out.println(i);
result = result - num;
i--;
}
}
return result;
}
public int char2Int(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;
default:return 0;
}
}