您的位置:首页 > 其它

13. Roman to Integer

2016-03-24 20:53 483 查看
题目

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.
分析
罗马字母向整数转换,小数在大数左边做减法,小数在大数右边做加法,倒序扫描字符串,用current_num保存上一次循环扫描的字符,map_it->second是当前字符,若大于则相加,同时改变current_num为当前字符,若等于则只相加,小于则只持续做减法,因为罗马字母运算规则中,当一个大数左边出现小数后,该小数左边要么是连续的该小数,要么就会比这个小数大,不会再比这个小数小,具体规则如下:V
和 X 左边的小数字只能用 Ⅰ;L 和 C 左边的小数字只能用X;D 和 M 左边的小数字只能用 C。例如:XC=90,LXXXIX=89,而不是IXC。所以一个大数左边的小数左边的数字,要么与小数相等,此时不改变current_num,仍指向大数,会持续做减法,要么大于等于大数,减法完成,分别根据两种情况做加法,只有大于大数的时候才会改变current_num。

class Solution {
public:
int romanToInt(string s) {
map<char,int> map_roman;
map_roman.insert(pair<char,int>('I',1));
map_roman.insert(pair<char,int>('X',10));
map_roman.insert(pair<char,int>('C',100));
map_roman.insert(pair<char,int>('M',1000));
map_roman.insert(pair<char,int>('V',5));
map_roman.insert(pair<char,int>('L',50));
map_roman.insert(pair<char,int>('D',500));
map<char,int>::iterator map_it;
int sum=0;
int current_num=map_roman.find(s[s.size()])->second;
for(int i=s.size();i>-1;i--)
{
map_it=map_roman.find(s[i]);
if(map_it->second>current_num)
{
sum=sum+map_it->second;
current_num=map_it->second;
}
else if(map_it->second==current_num)
{
sum=sum+map_it->second;
}
else
{
sum=sum-map_it->second;
}
}
return sum;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: