题意:罗马数字转十进制数字
思路:首先要知道一些罗马数字的组合规则:
I:1 V:5 X:10 L:50 C:100 D:500 M:1000
小的在大的前面相减,如:IV:4,CD:400
打的在小的前面相加,如:VI:6,DC:600
最多只能有一个小的在大的前面
而且小的在大的的前面只能有 XL XC CD CM IX IV 这几种形式,不能有IC这种表示99,可以用XCIX表示之
最多只能有三个一样的小的在大的后面
知道这些后就可以做这道题目了
其实无非就是找规律,我找到的规律是找出所有XL XC CD CM IX IV的组合累加,剩下的单独累加即可。网上也有更简单的方法。。
class Solution{
public:
int CharToInt(char ch){
switch(ch){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
default : return 1000;
}
}
int CharToInt2(char ch1, char ch2){
if(ch1 == 'X' && ch2 == 'L')
return 40;
if(ch1 == 'X' && ch2 == 'C')
return 90;
if(ch1 == 'C' && ch2 == 'D')
return 400;
if(ch1 == 'C' && ch2 == 'M')
return 900;
if(ch1 == 'I' && ch2 == 'X')
return 9;
return 4;
}
int romanToInt(string s){
int res = 0;
for(int i = 0; i < s.length(); i++){
if(i != s.length() - 1){
if(CharToInt(s[i]) < CharToInt(s[i+1])){
res += CharToInt2(s[i], s[i+1]);
i++;
}
else{
res += CharToInt(s[i]);
}
}
else{
res += CharToInt(s[i]);
}
}
return res;
}
};