Description
Solution 1(C++)
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> index { {'I', 1}, {'V', 5}, {'X', 10}, {'L',50},
{'C', 100},{'D', 500}, {'M', 1000} };
int len=s.size(), res=index[s[len-1]];
for(int i=len-1; i>0; i--){
if(index[s[i-1]]>= index[s[i]]){
res+= index[s[i-1]];
} else {
res-= index[s[i-1]];
}
}
return res;
}
};
算法分析
比较简单,搞清楚罗马数字转换成十进制数字的方法就好了。在此补充一下:
基本字符 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
相应的阿拉伯数字表示为 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
具体规则如下:
- 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
- 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
- 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
- 正常使用时、连写的数字重复不得超过三次;
- 在一个数的上面画一条横线、表示这个数扩大 1000 倍。
多的就不罗嗦啦。
程序分析
略。