13 Roman to Integer

罗马数字转换数字,行吧,你开心就好。

两个是不是可以形成一个永动机,你转化为我,我再转化为你。。。然后堆栈溢出,电脑爆炸,世界毁灭。

 

按照上题,列出来所有的

M、 CM、D、CD、C、XC、L、XL、X、IX、V、IV、I

int romanToInt(string s) {
        map<string, int> romanHash;
        romanHash["M"] = 1000;romanHash["CM"] = 900;
        romanHash["D"] = 500;romanHash["CD"] = 400;
        romanHash["C"] = 100;romanHash["XC"] = 90;
        romanHash["L"] = 50;romanHash["XL"] = 40;
        romanHash["X"] = 10;romanHash["IX"] = 9;
        romanHash["V"] = 5;romanHash["IV"] = 4;
        romanHash["I"] = 1;
        
        int number = 0;
        int size = s.size();
        string tempStr = "";
        for(int i = 0; i<size;){
            
            if(romanHash.find(tempStr+s[i]) != romanHash.end()){
                tempStr += s[i];
                i++;
            }else{
                number += romanHash[tempStr];
                tempStr = "";
            }
        }
        number+= romanHash[tempStr];
        return number;
    }

执行用时 : 168 ms, 在Roman to Integer的C++提交中击败了0.84% 的用户

内存消耗 : 37.9 MB, 在Roman to Integer的C++提交中击败了0.33% 的用户

需要注意的是最后会遗漏一个词,所以要加上

 

 

好了按照惯例来看看别人写的算法:

据leetcode称:执行32ms的算法:

class Solution {
public:
    int romanToInt(string s) {
        vector<int> backet(150);
        backet['I'] = 1;
        backet['V'] = 5;
        backet['X'] = 10;
        backet['L'] = 50;
        backet['C'] = 100;
        backet['D'] = 500;
        backet['M'] = 1000;
        int ans = 0;
        for(int i = 0; i < s.size(); i++) {
            if(i != s.size() - 1 && backet[s[i]] < backet[s[i + 1]]){
                ans -= backet[s[i]];
            }
            else ans += backet[s[i]];
        }
        return ans;
    }
};

执行用时 : 124 ms, 在Roman to Integer的C++提交中击败了0.84% 的用户

内存消耗 : 34.3 MB, 在Roman to Integer的C++提交中击败了0.33% 的用户

一件事可以确定了,就是leetcode针对我胖虎。 说好的执行32ms呢?难道速度还跟我的烂电脑有关吗??那你为啥要弄成云端的呢???

这个算法和我的不一样之处在于将特殊情况用逻辑表示了出来。

一般来说,罗马字符的排序是从左至右依次减小的,但是也有可能遇见增大的情况,当遇到这种情况时就是出现了4和9的10^n倍。当逆序情况下读两个,然后用大的减小的,正序情况读一个,然后直接相加即可。

上一篇:Leetcode 9-12


下一篇:LeetCode-12. Integer to Roman