13. Roman to Integer

来源:互联网 发布:网络出现异常怎么办 编辑:程序博客网 时间:2024/05/17 22:02

题目

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;    }};




0 0
原创粉丝点击