String:13. Roman to Integer

来源:互联网 发布:360软件推广联盟 编辑:程序博客网 时间:2024/06/07 21:01


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

1、重复数次:一个罗马数字重复几次,就表示这个数的几倍。

2、右加左减:
2.1 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
2.2 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
2.3 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
2.4 但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示。)
2.5 左减数字必须为一位,比如8写成VIII,而非IIX。

2.6 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)

class Solution {public:    int romanToInt(string s) {        map<char, int> m = {{'I', 1},{'V', 5}, {'X', 10}, {'L', 50},                             {'C', 100}, {'D', 500}, {'M', 1000}};        int result = 0;        for(int i = 0; i < s.size(); ++i)        {            //cout << s[i] << ":";            if(i == 0)            {                result += m[s[i]];                continue;            }            if(m[s[i]] > m[s[i - 1]])            {                result -= 2 * m[s[i - 1]];                result += m[s[i]];            }            else            {                result += m[s[i]];            }            //cout << result << endl;        }        return result;    }};
    我的方法……贼笨。遍历一遍字符串,如果这个字符比上一个字符小,就加到result里面,如果这个字符比上一个字符大,说明上一个字符应该减掉的,但是上一轮加上了,所以减去两倍的上个字符表示的大小,再加上这个字符大小。

    和我的方法一样但是写的更好的代码,是从后往前遍历,最后一个字母一定是加的,所以省掉了判断 i == 0 的一步。更简洁也更有效率。

int romanToInt(string s) {    unordered_map<char, int> T = { { 'I' , 1 },                                   { 'V' , 5 },                                   { 'X' , 10 },                                   { 'L' , 50 },                                   { 'C' , 100 },                                   { 'D' , 500 },                                   { 'M' , 1000 } };                                      int sum = T[s.back()];   for (int i = s.length() - 2; i >= 0; --i)    {       if (T[s[i]] < T[s[i + 1]])       {           sum -= T[s[i]];       }       else       {           sum += T[s[i]];       }   }      return sum;}


原创粉丝点击