您的位置:首页 > 其它

【LeetCode】13. Roman to Integer

2016-04-24 13:04 288 查看
题目:

Given a roman numeral, convert it to an integer.

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

理解:

给定一个罗马数字,将其转换为对应的整数。

输入范围为[1,3999]。

分析:

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

按照下面规则组合可以得到任意整数:

1.重复次数:一个罗马数字重复几次就表示这个数的几倍;

2.右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加上小数字;在一个较大的罗马数字左边记上一个较小的罗马数字,表示大数字剪去小数字。但是左减不能跨越等级,例如,99不能表示为IC,而是表示为XCIX;

3.加线乘千:在一个罗马数字上方加上一条很闲或者右下方写M,表示这个数字乘以1000,即使原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍;

4.单位限制:同样单位最多只能出现3次,如40不能表示为XXXX,而要表示为XL。

基于上面对罗马数字的理解,我们可以得到这道题的思路:

从右往左一次扫描每个字符,若当前字符右边存在比它大的字符,则用当前和减去该字符所表示的竖直;若不存在,则用当前和加上该字符所表示的数值。

代码:

class Solution {
public:

int getVal(char a)
{
switch(a)
{
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;
}
return 0;
}

int romanToInt(string s) {
int result=0;
char max='I';
for(int i=s.size()-1;i>=0;i--)
{
if(getVal(s[i])>=getVal(max))
{
max=s[i];
result+=getVal(s[i]);
}
else
result-=getVal(s[i]);
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: