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;
    }
};
posted @ 2021-05-21 13:35  Mrsdwang  阅读(42)  评论(0编辑  收藏  举报