您的位置:首页 > 其它

13. Roman to Integer

2016-03-21 19:55 274 查看
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>.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: