通过观察,发现字符串一般情况都是后面小于前面,因此考虑使用栈来解题。
class Solution {
public:
int romanToInt(string s) {
int len = s.size();
stack<int> myStack;
int current = 0;
for(int j = 0; j < len; ++j){
if(s[j] == 'I'){
current = 1;
}else if(s[j] == 'V'){
current = 5;
}else if(s[j] == 'X'){
current = 10;
}else if(s[j] == 'L'){
current = 50;
}else if(s[j] == 'C'){
current = 100;
}else if(s[j] == 'D'){
current = 500;
}else if(s[j] == 'M'){
current = 1000;
}
if(!myStack.empty() && current > myStack.top()){
if(current / myStack.top() == 5 || current / myStack.top() == 10){ //若新加入的字符满足一定条件
int temp = current - myStack.top(); //计算特殊情况下的实际数目
myStack.pop(); //栈顶出栈
myStack.push(temp); //特殊情况下的数目入栈
}
}else{
myStack.push(current); //其余都入栈
}
}
int result = 0;
while(!myStack.empty()){
result += myStack.top(); //计算总和
myStack.pop();
}
return result;
}
};