【Roman to Integer】 --MyLeetCode(五)

来源:互联网 发布:新西兰林肯大学 知乎 编辑:程序博客网 时间:2024/06/06 03:07


Description:


Given a roman numeral, convert it to an integer.

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


Hints:

1.

    { 'I' = 1 },                                   { 'V' = 5 },                                   { 'X' = 10 },                                   { 'L' = 50 },                                   { 'C' = 100 },                                   { 'D' = 500 },                                   { 'M' = 1000 } 

2.

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

My solution:


class Solution {public:    int romanToInt(string s) {        int res = 0;        for(int i = s.size() - 1 ; i >=0 ; --i){            char c = s.at(i);            switch(c){            case 'I':                res += (res >= 5 ? -1 : 1);                break;            case 'V':                res += 5;                break;            case 'X':                res += 10 * (res >= 50 ? -1 : 1);                break;            case 'L':                res += 50 ;                break;            case 'C':                res += 100 * (res >= 500 ? -1 : 1);                break;            case 'D':                res += 500;                break;            case 'M':                res += 1000;                break;            }        }        return res;    }};

Advanced Solution:


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



原创粉丝点击