13. Roman to Integer [easy] (Python)
2016-05-18 23:01
531 查看
题目链接
https://leetcode.com/problems/roman-to-integer/题目原文
Given a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999.
题目翻译
给定一个罗马数字,将其转成整数。输入限制在1到3999之间。思路方法
做题的第一步要理解题。说实话,我是不清楚罗马数字的记法的,所以查了一下资料,这里也简单介绍一下吧。罗马数字采用七个罗马字母作数字:
I(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。
记数的方法:
1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如 III=3;
2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 VIII=8、XIII=12;
3. 小的数字(限于 I、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 IV=4、IX=9;
4. 在一个数的上面画一条横线,表示这个数增值 1,000 倍。
常用数字记法举例:
Roman | Integer | Roman | Integer | |
---|---|---|---|---|
I | 1 | XXIX | 29 | |
II | 2 | XXX | 30 | |
III | 3 | XL | 40 | |
IV | 4 | L | 50 | |
V | 5 | LX | 60 | |
VI | 6 | LXX | 70 | |
VII | 7 | LXXX | 80 | |
VIII | 8 | XC | 90 | |
IX | 9 | XCIX | 99 | |
X | 10 | C | 100 | |
XI | 11 | CI | 101 | |
XII | 12 | CXCIX | 199 | |
XIII | 13 | CC | 200 | |
XIV | 14 | CCC | 300 | |
XV | 15 | CD | 400 | |
XVI | 16 | D | 500 | |
XVII | 17 | DCLXVI | 666 | |
XVIII | 18 | M | 1,000 | |
XIX | 19 | MCMXCIX | 1,999 | |
XX | 20 | MM | 2,000 | |
XXI | 21 | MMM | 3,000 | |
XXII | 22 | MMMM | 4,000 | |
XXVIII | 28 | MMMMCMXCIX | 4,999 |
思路一
根据上面说的计数方法的前三条。对于输入的罗马数字字符串,从后向前扫描,遇到前面数大于等于后面的最大数的时候,相加;遇到前面数小于后面的最大数的时候,相减。代码
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ digits = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} sum = 0 maxDigit = 1 for i in xrange(len(s)-1, -1, -1): if digits[s[i]] >= maxDigit: maxDigit = digits[s[i]] sum += digits[s[i]] else: sum -= digits[s[i]] return sum
思路二
仅考虑相邻的罗马数字的大小情况。对于输入的罗马数字字符串,从后向前扫描,遇到前面数大于等于后面数的时候,相加;遇到前面数小于后面数的时候,相减。(该思路也可以从前向后扫描)代码
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ digits = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} sum = digits[s[len(s)-1]] for i in xrange(len(s)-1, 0, -1): cur = digits[s[i]] pre = digits[s[i-1]] sum += pre if pre >= cur else -pre return sum
说明
上面两个思路都可以AC,但其实隐含了一些条件,比如有些罗马数字的写法是不合法的。所以考虑这个问题的时候,想的太多反而比较难做AC。
比如,XVILCDM,如果按照第一个思路结果是500-100-50-1-5-10=334;但如果按照第二个思路,则结果是500-100-50-1+(5+10) = 364。
所以我觉得,题目描述不够清晰,如果对罗马数字的表示规则不熟悉,这个题目还是不要太纠结了。。。
PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:/article/11857833.html
相关文章推荐
- python
- python 下字符串格式时间比较
- Python处理多个客户端连接---派生服务器
- Python 模块之间的调用
- 解决 Mac 上用 Pycharm 搭建 openCV 的 python 开发环境中的问题
- python反射
- Kivy python在ubuntu下安装使用
- Kivy python在ubuntu下安装使用
- python中%和format
- python静态网页爬虫之xpath
- The internals of Python string interning
- Java&Python操作WebHDFS
- Python dictionary implementation
- python中join和split函数
- [python爬虫]爬取贴吧某页美女图片+爬取糗百美女图片
- python3 下ascii与 str的转换
- Python的基础--对象 转
- Python在Myeclipse上配置(解决Pydev插件不出现和安装标准库的方法)
- 深度学习(一)autoencoder的Python实现(1)
- python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域