罗马数字转换数字,行吧,你开心就好。
两个是不是可以形成一个永动机,你转化为我,我再转化为你。。。然后堆栈溢出,电脑爆炸,世界毁灭。
按照上题,列出来所有的
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倍。当逆序情况下读两个,然后用大的减小的,正序情况读一个,然后直接相加即可。