LeetCode专题-Python实现之第13题:Roman to Integer
相关代码已经上传到github:https://github.com/exploitht/leetcode-python
文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小写问题等等;更合理的代码实现参考我的github repo
1、读题
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, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
2、解题
要解这道题第一步是搞清楚罗马数字的个啥,查阅维基百科有如下描述:
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。按照下述的规则可以表示任意正整数。需要注意的是罗马数字中没有“0”,与进位制无关。一般认为罗马数字只用来记数,而不作演算。
重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:
- 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
- 较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
- 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
- 但是,左减时不可跨越一个位值。比如,99不可以用IC( {\displaystyle 100-1} 100-1)表示,而是用XCIX( {\displaystyle [100-10]+[10-1]} [100-10]+[10-1])表示。(等同于阿拉伯数字每位数字分别表示。)
- 左减数字必须为一位,比如8写成VIII,而非IIX。
右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
加线乘千:
- 在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。
- 同理,如果上方有两条横线,即是原数的1000000( {\displaystyle 1000^{2}} 1000^{{2}})倍。
数码限制:
- 同一数码最多只能连续出现三次,如40不可表示为XXXX,而要表示为XL。
- 例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替IV。
上面这一大堆,归纳起来和我们解题相关的其实就一句话,右加左减。加简单,读到一个字符是V就加上5,简单的事情,减怎么处理呢?从左往右就涉及到读取一个数字,增加了这个数字之后,发现这个数字后面有一个更大的,那么当前数字其实应该被减,但是处理后面一个数字的时候要操作前一个数字,又得维护一个单独的索引,关键是操作的这个数字是前面处理过的。反过来思考行不行呢?我从字符串最后一个开始解析,读到数字就累加,但是加一个判断,如果读到的数字比前一个数字小,那么就不做加法,而是采取减法。这样做就是解析一个字符,处理一个数字,代码实现如下:
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
# 罗马数字和阿拉伯数字的对应关系
roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = roman_dict.get(s[-1])
for index in range(len(s)-2, -1, -1):
if roman_dict.get(s[index]) < roman_dict.get(s[index+1]):
result -= roman_dict.get(s[index])
else:
result += roman_dict.get(s[index])
return result
LeetCode专题-Python实现之第13题:Roman to Integer的更多相关文章
- LeetCode专题-Python实现之第7题:Reverse Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第28题: Implement strStr()
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第27题:Remove Element
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第21题:Merge Two Sorted Lists
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第20题:Valid Parentheses
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第9题:Palindrome Number
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第14题:Longest Common Prefix
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第1题:Two Sum
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
随机推荐
- Spring Cloud 微服务笔记(六)Spring Cloud Hystrix
Spring Cloud Hystrix Hystrix是一个延迟和容错库,旨在隔离远程系统.服务和第三方库,阻止链接故障,在复杂的分布式系统中实现恢复能力. 一.快速入门 1)依赖: <dep ...
- css 控制横向布局,超出隐藏,滚动
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...
- DirBuster工具扫描敏感文件
DirBuster是一个多线程Java应用程序,旨在强制Web/应用程序服务器上的目录和文件名.它可以选择执行纯暴力,在查询隐藏文件和目录方面非常好用. 1)安装DirBuster 前提:电脑中必须安 ...
- C# yield return 和 yield break
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 以下对比了使用yield return与不使用yie ...
- vue 路由跳转,传参
一.直接跳转 //js1.this.$router.push('/ad_new') //html 2.<router-link to="/ad_check"> < ...
- 36ArcGIS API for JavaScript3.X 系列加载天地图(经纬度)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- spring的配置和使用
spring的配置和使用 1. 创建基于java的配置. 配置极少量的XML来启用java配置: <?xml version="1.0" encoding="U ...
- Ubuntu添加中文输入法
1.点击左上角Dash home 2.输入keyboard input methods 3.点击keyboard input methods,选择input methods,打钩. 4.点击下三角,选 ...
- ps入门学习
快捷键 打开 ctrl+O 切换显示窗口 ctrl+tab 隐藏工具栏和面板 tab 只隐藏面板不隐藏工具栏 shift+tab 切换屏幕模式 F 文件的新建与格式 1.新建文档Ctrl+N,存 ...
- DCOS实践分享(5):Open DCOS深入分析
2016/05/18(三) 09:30 OpenDC/OS研討會暨工作坊 指導單位:經濟部.科技部 主辦單位:工業技術研究院.Linker Networks 協辦單位:Microsoft.資通訊產業聯 ...