13. 罗马数字转整数
思路:
一开始是打算用hash表来记录每个字母代表的数字的,但是想了一下好像直接if判断来加也可以,然后就开始if了。
然后想判断IV IX这类的的时候判断条件设置的是i!=n-1&&s[i+1]='V'这样的,也是能做的,但是if太多了。
我这时候并没有想到IV这种情况可以概括为小的数放在大的数左边,然后用hash表记录了各种字母代表的数后还是用了很多if来写。
看了题解才直到是这个规律。罗马数从左到右是降序的,所以如果有小的数出现在大的数的左边,那么就减去小的数的值就可以了,那么很多if就可以只用一个条件来写了。
代码:
class Solution {
public:
int Getvalue(char ch){
switch(ch){
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;
};
return 0;
}
int romanToInt(string s) {
int n = s.length();
int res=0;
for(int i=0;i<n;++i){
int temp = Getvalue(s[i]);
if(i!=n-1&&temp<Getvalue(s[i+1])){
res -= temp;
}
else res+=temp;
}
return res;
}
};