【LeetCode】13. Roman to Integer

题目:

         Given a roman numeral, convert it to an integer.

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


理解:

         给定一个罗马数字,将其转换为对应的整数。

         输入范围为[1,3999]。


分析

             罗马数字总共有7个,即:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)

        按照下面规则组合可以得到任意整数:

        1.重复次数:一个罗马数字重复几次就表示这个数的几倍;

        2.右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加上小数字;在一个较大的罗马数字左边记上一个较小的罗马数字,表示大数字剪去小数字。但是左减不能跨越等级,例如,99不能表示为IC,而是表示为XCIX;

        3.加线乘千:在一个罗马数字上方加上一条很闲或者右下方写M,表示这个数字乘以1000,即使原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍;

        4.单位限制:同样单位最多只能出现3次,如40不能表示为XXXX,而要表示为XL。


        基于上面对罗马数字的理解,我们可以得到这道题的思路:

        从右往左一次扫描每个字符,若当前字符右边存在比它大的字符,则用当前和减去该字符所表示的竖直;若不存在,则用当前和加上该字符所表示的数值。


代码:

class Solution {
public:

    int getVal(char a)
    {
        switch(a)
        {
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
        }
        return 0;
    }
    
    int romanToInt(string s) {
        int result=0;
        char max='I';
        for(int i=s.size()-1;i>=0;i--)
        {
            if(getVal(s[i])>=getVal(max))
            {
                max=s[i];
                result+=getVal(s[i]);
            }
            else
                result-=getVal(s[i]);
        }
        return result;
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值