Leetcode--Roman to Integer

来源:互联网 发布:淘宝下载新版下载安装 编辑:程序博客网 时间:2024/06/10 23:09

Problem Description:

Given a roman numeral, convert it to an integer.

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

分析:题目的意思是将罗马数字转化成整数,首先是在网上找到关于罗马数字表示法的规则如下:

 1、计数方法:① 罗马数字就有下面七个基本符号:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、L(50)、C(100)、D(500)、M(1000)。

                             ② 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;XX=20;CC=200;MMM=3000;

                             ③ 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;

                             ④ 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

                             ⑤  正常使用时连写的数字重复不得超过三次;


   2、组数规则: ① 基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。

                         ② 不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目;

                         ③ V 和X 左边的小数字只能用Ⅰ。

                         ④ L 和C 左边的小数字只能用X。

                         ⑤ D 和M 左边的小数字只能用C。


还有一些规则是当整数大于3999时需要考虑的,这个题目就不用考虑了。依照上述规则,可以看出罗马数字计数法转化成整数时如果当前的数字temp小于等于左边的数字last,则直接相加;否则应该加上temp-2*last;按照这一规则,写出转化代码如下:

class Solution {public:   int rtoi(char ch)    {        switch(ch){            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;            default:return 0;        }    }    int romanToInt(string s) {        int res=0;        if(s.empty())            return 0;        int temp,last;        temp=rtoi(s[0]);        last=temp;        res+=last;        for(int i=1;i<s.size();++i)        {            temp=rtoi(s[i]);            if(temp<=last)                res+=temp;            else                res+=temp-2*last;            last=temp;        }        return res;    }};


0 0
原创粉丝点击