首先想到的是最暴力的解法,列出所有的可能,其实不用考虑字符串长度是奇数还是偶数,如果有下一位的话就判断是否属于特殊情况,如果没有下一位的话,就按照单位字符处理。运行结果超过86%的提交。
Tips
continue
只退出单层循环。break
退出整个循环。- 在处理字符串类型时,末尾会存在一位
/0
,所以在i
到末尾时,判断i+1
位不会出现超出索引范围的错误。
题解1
#include "iostream"
#include "string"
using namespace std;
class Solution {
public:
int romanToInt(string s) {
int len=s.length();
int res=0;
for(int i=0;i<len; )
{
if(s[i]=='I'&&s[i+1]=='V')
{
res=res+4;
i+=2;
continue;
}
if(s[i]=='I'&&s[i+1]=='X')
{
res=res+9;
i+=2;
continue;
}
if(s[i]=='X'&&s[i+1]=='L')
{
res=res+40;
i+=2;
continue;
}
if(s[i]=='X'&&s[i+1]=='C')
{
res=res+90;
i+=2;
continue;
}
if(s[i]=='C'&&s[i+1]=='D')
{
res=res+400;
i+=2;
continue;
}
if(s[i]=='C'&& s[i+1]=='M')
{
res=res+900;
i+=2;
continue;
}
else
{
switch(s[i])
{
case 'I':res=res+1;i+=1;break;
case 'V':res=res+5;i+=1;break;
case 'X':res=res+10;i+=1;break;
case 'L':res=res+50; i+=1;break;
case 'C':res=res+100; i+=1;break;
case 'D':res=res+500; i+=1;break;
case 'M':res=res+1000; i+=1;break;
}
}
}
return res;
}
};
更简洁的方法是使用哈希表,一次遍历。但是代码简单了,时间效率却下降了。运行时间仅超过14%的提交。
#include "iostream"
#include "string"
#include "map"
using namespace std;
class Solution {
public:
int romanToInt(string s)
{
// roman.insert(make_pair('M',1000));
map<char,int>roman={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500}, {'M',1000}};
int res=0,ans=0;
for(int i=0; i<s.length();i++){
if(roman[s[i]]<roman[s[i+1]])
{
res=res+roman[s[i+1]]-roman[s[i]];
i++;
}
else
{
res=res+roman[s[i]];
}
}
return res;
}
};