【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。
基于上面对罗马数字的理解,我们可以得到这道题的思路:
从右往左一次扫描每个字符,若当前字符右边存在比它大的字符,则用当前和减去该字符所表示的竖直;若不存在,则用当前和加上该字符所表示的数值。
代码:
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; } };
相关文章推荐
- mac机上搭建php56/nginx 1.8.x/thinkphp 3.2.x/gearman扩展/seaslog扩展/redis扩展环境
- Redis安装配置
- 【topcoder】 SRM 144 div 2 200
- 逆元总结
- MBTI职业性格测试
- 用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
- httpd 服务的两个节点的HA
- Docker网络配置(三)
- 一个整形数组中只有两个数字是出现一次,其它成对出现
- 对apply和call的理解
- 一个函数如何返回多个参数
- linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
- 屏幕截图
- 枚举
- 自己训练SVM分类器进行HOG行人检测
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
- 图片渲染的应用
- 第8周项目3-指向学生类的指针
- 从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本
- Material Design Ripple Button