美文网首页
LeetCode 随笔1-罗马数字转整数

LeetCode 随笔1-罗马数字转整数

作者: Polo1004 | 来源:发表于2020-04-08 06:29 被阅读0次

罗马数字转整数

I = 1

V = 5

X = 10

L = 50

C = 100

D = 500

M = 1000

ps:小的数字在大的数字左边,则为大的数字减去左边的数字(只有I,X,C可以作为小的数字出现在大的数字前面),且只能在它们下一位和下下位字母的前面(I只能在V和X的前面,X只能在L和C的前面,C只能在D和M的前面)
e.g:4 = IV, 9 = IX, 40 = XL, 90 = XC
44 = XLIV, 99 = XCIX 而不是 IC, 49 = XLIX 而不是 IL

思路

字符组合最多只有13种组合,组合数确定且元素少,使用map能最快的匹配符号数字

class Solution {
public:
    int romanToInt(string s) {
        unordered_map <string,int> m = {{"I":1},
                                {"IV":3},
                                {"IX":8},
                                {"V":5},
                                {"X":10},
                                {"XL":30},
                                {"XC":80},
                                {"L":50},
                                {"C":100},
                                {"CD":300},
                                {"CM":800},
                                {"D":500},
                                {"M":1000}};
        int first = m[s.substr(0, 1)];
        for(int i=1; i<s.size(); ++i){
            string two = s.substr(i-1, 2);
            string one = s.substr(i, 1);
            first += m[two] ? m[two] : m[one];
        }
        return r;
    }
};

优化

IV,IX 定义为3,8,因为字符是++遍历,例如IV,先是遍历I=1,在遍历V=5,这里还需要判断IV是否匹配,匹配为4并删除之前的结果,这里需要处理之前得出的两个数字1和5,会过度操作且复杂,改为每次都会匹配当前位 以及 带上前一位组合的成的字符,如果匹配则留下两加,还是IV,首先I=1,加入总数,遍历+1,遍历V以及IV,IV存在则加入总数,则总数1+3=4,再例如XI,首先X=10,加入总数,遍历+1,遍历I以及XI,XI不存在,则I加入总数,10+1 = 11

相关文章

网友评论

      本文标题:LeetCode 随笔1-罗马数字转整数

      本文链接:https://www.haomeiwen.com/subject/fhkozttx.html