13. Roman to Integer

来源:互联网 发布:适配器模式 java 编辑:程序博客网 时间:2024/06/03 12:01

1.Question

Given a roman numeral, convert it to an integer.

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

2.Code

codeA

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

codeB

class Solution {public:    int romanToInt(string s) {        int sum = 0;    for(int i = 0; i < s.size(); i++)    {        int s1 = sigleRomanToInt(s[i]), s2 = sigleRomanToInt(s[i+1]);    if(s1 < s2)    {    sum += s2 - s1;    i++;    }    else    sum += s1;    }         return sum;    }        int sigleRomanToInt(char c){        switch(c)        {            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;        }    }};

3.Note

a. codeA 利用一个哈希表来将字母和数字进行映射, codeB 通过swich case 来映射。在leetcode 上 codeB 要比 codeA 快一倍。

b. 本题思想是根据罗马数字的规律,“小数”组合最多只能由两个罗马数字组成,所以我们每次检测相邻的两个罗马数字就好了,如果是“小数”则当“小数”处理,如果不是“小数”,则把当前罗马数字当单个罗马数字处理就好了。还有一点要考虑的是最后罗马数字的情况。

c. 其实还有一种更简洁的做法,一次遍历就可以了。就是遍历罗马数字,如果当前罗马数字比后一个数大,则 sum+= 当前罗马数字,如果当前罗马数字比后一个数小,则 sum-= 当前罗马数字。这个解法更简洁,他满足罗马数字的分布条件。

d. 头文件<unordered_map>,<string>.

0 0