将罗马数字转化为十进制数字
Leetcode上的一道简单级别的题目
将罗马数字转化为对应的十进制数字,其中罗马数字的范围在1~3999
这题的关键在于了解需求,及如何将罗马数字转化为对应的十进制数字
罗马数字转化为十进制数字的规则为:
用作数字的罗马字母共有七个,即Ⅰ(1),Ⅴ(5),Ⅹ(10),L(50),C(100),D(500),M(1000).
相同的数字连写,所表示的数等于这些数相加
如果大的数字在前,小的数字在后,所表示的数等于这些数相加 如:VIII = 8,
如果小的数字在前,大的数字在后,所表示的数等于从大数减去小数。如:IX = 9
我的解答中使用了类似于链表的方法
创建两个变量current和next分别表示当前节点和下一个节点,当当前节点和下一个节点的值不同时,则将当前temp中的值根据比较结果添加至result,并赋值temp为下一个节点的值,否则将值累加至temp
为了比较方便,我在输入的string最后添加了一个‘O’其对应的值为0
/**
* @author rale
*
*Given a roman numeral, convert it to an integer.
*Input is guaranteed to be within the range from 1 to 3999.
*
*/
public class RomanToInteger {
public int romanToInt(String s) {
//将两个if判断删去后测试得到的结果性能更好 可能和测试用例有关
if(s==null || s.equals("")){
return 0;
}
if(s.length()==1){
return singleRomanToInt(s.charAt(0));
}
s += 'O';
int result = 0;
char[] romanChars = s.toCharArray();
char current = romanChars[0];
char next = romanChars[1];
int temp = singleRomanToInt(current);
for(int i = 0 ; i<romanChars.length-1 ; i++){
current = romanChars[i];
next = romanChars[i+1];
int currentInt = singleRomanToInt(current);
int nextInt = singleRomanToInt(next);
if(currentInt==nextInt){
temp += nextInt;
}else if(currentInt<nextInt){
result -= temp;
temp = nextInt;
}else if(currentInt>nextInt){
result += temp;
temp = nextInt;
}
}
return result;
}
//将单个罗马字母转化为对应的数字
private int singleRomanToInt(char s){
int result = 0;
switch(s){
case 'I' :
result = 1;
break;
case 'V' :
result = 5;
break;
case 'X' :
result = 10;
break;
case 'L' :
result = 50;
break;
case 'C' :
result = 100;
break;
case 'D' :
result = 500;
break;
case 'M' :
result = 1000;
break;
default :
result = 0;
break;
}
return result;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。