首先我们需要了解罗马数字的表示方法,才能够设计罗马数字转化为整数的算法。罗马数字介绍可以详见百度百科或者维基百科等等。
可以简化如下
I | V | X | L | C | D | M |
1 | 5 | 10 | 50 | 100 | 500 | 1000 |
根据罗马数字表示规则,我们可以初始化一个couter,然后一遍遍历,得出答案
代码如下
class Solution {
public:
int romanToInt(string s) {
int sSize = s.size();
int couter = 0;
int i;
string temp;
for(i = 0;i < sSize;i ++){
if(s.substr(i,1) == "I"){
if(s.substr(i+1, 1) == "I" || (i+1) == sSize)
couter ++;
else
couter --;
}
else if(s.substr(i, 1) == "V")
couter += 5;
else if(s.substr(i, 1) == "X"){
if(s.substr(i+1, 1) == "L" || s.substr(i+1, 1) == "C")
couter -= 10;
else
couter += 10;
}
else if(s.substr(i, 1) == "L")
couter += 50;
else if(s.substr(i, 1) == "C"){
if(s.substr(i+1,1) == "D" || s.substr(i+1,1) == "M")
couter -= 100;
else
couter += 100;
}
else if(s.substr(i, 1) == "D")
couter += 500;
else if(s.substr(i, 1) == "M")
couter += 1000;
}
return couter;
}
};
本来想用swich case语句,这样思想是相同的,代码量可以少一点。但在C++里面,switch语句,后面不能用string类型的变量,但可以通过hash表来解决,我就比较暴力的把switch写成了if else。