Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
看到这道题,我是懵的,为何?我根本就不了解罗马数字的基本知识,想不到它还有这个规律。
- 罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
- 四个规则:
a) 相同的数字连写,所表示的数等于这些数字相加得到的数,如VVV表示 15;
b) 左大右小加:左边的数大右边的数小,所表示的数等于这些数字相加得到的数,如VI表示5+1=6;
c) 左小右大减:左边的数小右边的数大,所表示的数等于大数减去小数,但这个小的数仅限于I,X,C;但是,这种减不可跨越一个为位数,等同于阿拉伯数字每位都分别表示。比如,99不可以用IC(100-1)表示,而是使用XCIX([100-1][10-1])表示;
d)在一个数的上面画一条横线,表示这个数增值1000倍; - 如果判断一个罗马数字是不是合理的,上面的规则可能都要考虑到,但此题是指将一个罗马数字转换为整数,就是说罗马数字本身已经是合理的,这样就简单多了,重点是处理好前后两个位置上数的大小关系。
注意:比较的时候是将前后两位的数进行对比的结果来确认对前面一位数字的运算,最后一位特殊处理,而不是将前面已经计算出的总数的和和后面一位对比。我参照了很多博客,后来借鉴的是http://blog.youkuaiyun.com/worldwindjp/article/details/42062711这位的逻辑思想:
一、判断当前字符是否比next字符小,如果小的话就用下一位字符减去当前位字符后加到最终结果上,此时相当于一次性处理了两个位置;
二、否则,就把当前字符直接加到最终结果上。 - 我的代码如下:
public int romanToInt(String s) {
char[] arr = s.toCharArray();
int len = arr.length;
int result = 0;
int current = 0;
int next = 0;
int i;
for(i=0;i<len-1;i++){
current = corrdingNum(arr[i]);
next = corrdingNum(arr[i+1]);
if(current >= next){
result += current;
}else{
int temp = next - current;
result += temp;
i++;
}
}
if(i != len){
result += corrdingNum(arr[len-1]);
}
return result;
}
public int corrdingNum(char c){
int num = 0;
switch(c){
case 'I':
num = 1;
break;
case 'V':
num = 5;
break;
case 'X':
num = 10;
break;
case 'L':
num = 50;
break;
case 'C':
num = 100;
break;
case 'D':
num = 500;
break;
case 'M':
num = 1000;
break;
}
return num;
}