使用map解法
思路:建立罗马数字和整数的映射,从前到后如果前边一个罗马数字的值小于后边,则相减,否则相加
class Solution {
public:
int romanToInt(string s) {
map<char, int> hm={{'I', 1}, {'V', 5}, {'X', 10},
{'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
int len=s.length();
int ans=0;
for(int i=0; i<len; i++){
if(i<len-1){
if(hm[s[i]]<hm[s[i+1]]){
ans+=(hm[s[i+1]]-hm[s[i]]);
i+=1;
}
else{
ans+=hm[s[i]];
}
}
else
ans+=(hm[s[i]]);
}
return ans;
}
数组解法
思路:与上述解法思路相似,只是map换做了数组
class Solution {
public:
int romanToInt(string s) {
int x=0;
char a[7]{'M','D','C','L','X','V','I'};
int c[7]{1000,500,100,50,10,5,1};
for(int i=0;i<s.size()-1;i++)
{
int k=0;
int n=0;
while(s[i]!=a[k]) k++;
while(s[i+1]!=a[n]) n++;
if(k<=n)
x=x+c[k];
else
x=x-c[k];
}
int k=0;
while(s[s.size()-1]!=a[k]) k++;
x=x+c[k];
return x;
}
};
提交结果显示,用数组的效率要远大于map
推测原因是map的存储和查找因为涉及到很多函数的调用,会产生很大的系统开销,所以下次遇到类似的问题可以优先考虑数组