Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

先复习一下罗马数字的表示方法:

罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。

  • 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
  • 右加左减:
    • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
    • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
    • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
    • 但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示。)
    • 左减数字必须为一位,比如8写成VIII,而非IIX。
    • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)
  • 加线乘千:
    • 在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。
    • 同理,如果上方有两条横线,即是原数的1000000(1000^{2})倍。
  • 数码限制:
    • 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。
    • 例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替Ⅳ。

罗马数字 数值 拉丁语
I1unus
II2duo
III3tres
IV4quattuor
V5quinque
VI6sex
VII7septem
VIII8octo
IX9novem
X10decem
XI11undecim
XII12duodecim
XIII13tresdecim
XIV14quattuordecim
XV15quindecim
XVI16sedecim
XVII17septendecim
XVIII18duodeviginti
XIX19undeviginti
XX20viginti
XXX30triginta
XL40quadraginta
L50quinquaginta
LX60sexaginta
LXX70septuaginta
LXXX80octoginta
XC90nonaginta
XCIX99nonaginta novem
C100centum
CI101centum et unus
CII102cij
CXCIX199centum nonaginta novem
CC200ducenti
CCC300trecenti
CD400quadringenta
D500quincenti
DC600sexcenta
DCCC800octingenti
CM900nongentos

思路:从头到尾扫描,遇到当前的罗马数值比下一位小,就把下一位减去当前位数值的差加到和中,并跳过下一位继续扫描。

class Solution {
public:
    int romanToInt(string s) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if(s.size() == 0)
            return 0; 
       map<char, int> m;
       m.insert(pair<char,int> ('I', 1));
       m.insert(pair<char,int> ('V', 5));
       m.insert(pair<char,int>('X', 10));
       m.insert(pair<char,int>('L', 50));
       m.insert(pair<char,int>('C', 100));
       m.insert(pair<char,int>('D', 500));
       m.insert(pair<char,int>('M', 1000));
       map<char, int>::iterator it;
       int sum = 0;
       for(int i = 0; i < s.size(); i++){
           it = m.find(s[i]);
           if(i+1 < s.size() && it->second < m.find(s[i+1])->second ){
               map<char, int>::iterator it2 = m.find(s[i+1]);
               sum += (it2->second - it->second);
               i++;      
           }
           else {
               sum += it->second;      
           }         
       }
       
       return sum;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值