思路:
1.以string字符串为基础,一个个识别字符,然后转成对应的数字。
2.正常情况下是
ans=s[0] (需要转成数字)
左边>右边,只需要一个个累加就可以,ans=ans+右边
左边=右边, ans=ans+右边
特殊情况下,
左边<右边, 结果ans=ans+右边-2左边 (上一次已经加过左边)
(此处我的思路是对第二个数判断处理,也可以对第一个数进行处理,那样就不用-2左边,而是ans=ans-左边)
左边>右边,只需要一个个累加就可以,ans=ans+左边
左边=右边, ans=ans+左边
特殊情况下,ans=ans-左边
3.为了方便进行判断左右关系,同时读取两个数,但是如果出现特殊情况,左边在上一步已经加过了,所以需要减去2个左边。
4.如果给定的字符串s是一定正确表示的罗马数字,那么按规则n位数最多出现n次特殊情况,而且左边和右边的数一定是规则里限定的,
不会出现99=IC 错误表达
不会出现900+400=CMCD 错误表达
5. string的单个元素是char,以单引号‘ ’,字符串才是双引号“ ”
方法一:字符串判断,累和
class Solution {
public:
int changeRoma(char a)
{
if(a=='I')
return 1;
else if(a=='V')
return 5;
else if(a=='X')
return 10;
else if(a=='L')
return 50;
else if(a=='C')
return 100;
else if(a=='D')
return 500;
else if(a=='M')
return 1000;
else
return 0;
return 0;
}
int romanToInt(string s) {
int len=s.size();
int i=0;
int r=0;
int l=0;
int ans=changeRoma(s[0]);
while(i<len-1)
{
l=changeRoma(s[i]);
r=changeRoma(s[i+1]);
if(l<r)
{ ans=ans-l+r-l; }
else
{ ans=ans+r; }
i++;
}
return ans;
}
};
提升:
-
使用哈希表匹配值
unordered_map<string, int> m = {{“I”, 1}, {“IX”, 8}, {“V”, 5}, {“X”, 10}, {“L”, 50}, {“C”, 100}, {“D”, 500}, {“M”, 1000}}; -
条件运算符 ?
a=Exp1 ? Exp2 : Exp3;
exp1为真,则a=exp2,否则a=exp3
看完其他人的代码,感觉都是差不多思路的,没有必要去把 IV=3 (实际是4)这种变相扭曲可读性来实现代码精简。
思路都差不多。