leetcode笔记--Roman to Integer
2016-02-24 12:12
288 查看
题目:难度(Easy)
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Tags:Math String
Similar Problems:(M) Integer to Roman
分析:关于罗马数字的详细介绍可参见这篇文档:罗马数字转换阿拉伯数字http://wenku.baidu.com/link?url=P4X5K8sJJLB4I-kpTQVLGfUiIjlBSI6gAamSP47CZDs4MqIjqKdFedQxr7bhTaMszoqokSFgQBtHVyhY2K7wy_pg5Fa0VJHr7Xh8_udYfvy
主要有以下几个特点:罗马数字共有七个,即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。
最重要的是第2点,根据这个特点,我们可以依次读取一个字符,然后比较他和他后面的字符的大小(罗马数字所代表的整数值的大小),如果他小,说明他是要被减去的,如果相等或大于,说明他的整数值是要被加上的,知道读取到最后一个字符。
代码实现:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Tags:Math String
Similar Problems:(M) Integer to Roman
分析:关于罗马数字的详细介绍可参见这篇文档:罗马数字转换阿拉伯数字http://wenku.baidu.com/link?url=P4X5K8sJJLB4I-kpTQVLGfUiIjlBSI6gAamSP47CZDs4MqIjqKdFedQxr7bhTaMszoqokSFgQBtHVyhY2K7wy_pg5Fa0VJHr7Xh8_udYfvy
主要有以下几个特点:罗马数字共有七个,即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。
最重要的是第2点,根据这个特点,我们可以依次读取一个字符,然后比较他和他后面的字符的大小(罗马数字所代表的整数值的大小),如果他小,说明他是要被减去的,如果相等或大于,说明他的整数值是要被加上的,知道读取到最后一个字符。
代码实现:
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ #罗马字母公共7个,先从小到大排列如下:I(1),V(5),X(10),L(50),C(100),D(500),M(1000) #romanChar = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] #之前用的列表,但list的index操作没有map(hash)快 romanChar = {'I':1, 'V':2, 'X':3, 'L':4, 'C':5, 'D':6, 'M':7} mapper = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} result = 0 for i in range(len(s)): if i < len(s) - 1: #s[i]不是最后一个字符 #if romanChar.index(s[i]) < romanChar.index(s[i+1]): if romanChar[s[i]] < romanChar[s[i+1]]: result -= mapper[s[i]] else: result += mapper[s[i]] else: #处理最后一个字符 result += mapper[s[i]] return result
相关文章推荐
- yii model层操作总结
- SSH框架搭建+log4j配置
- CentOS6.3 重启后/etc/resolv.conf 被还原解决办法
- IOS中延时执行的几种方式的比较和汇总
- Linux找不到主机名解决办法
- Signalr系列之虚拟目录详解与应用中的CDN加速实战
- 使用lhgdialog的会话
- 《从零开始学Swift》学习笔记(Day5)——我所知道的标识符和关键字
- SYN flooding引发的网络故障
- eclipse连接远程hadoop集群开发时报错
- SYN flooding引发的网络故障
- LTP4J的使用BUG及解决方案
- yii框架缓存知识总结(转载)
- bash: hadoop: command not found
- localhost: Error: JAVA_HOME is not set. [Hadoop] Error: JAVA_HOME is not set
- 2016第一帖
- 读后感
- 关于.NET编译的目标平台(AnyCPU,x86,x64)(转)
- TypeError: ObjectId('') is not JSON serializable
- Hadoop详细配置