Python学习日记004——罗马数字转整数

题目来源:LeetCode题库——罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

Example1:
输入:“III”
输出:3
Example2:
输入:“IV”
输出:4
Example3:
输入:“XXVII”
输出:27
Example4:
输入:“LVIII”
输出:58
Example5:
输入:“MCMXCIV”
输出:1994

链接:https://leetcode-cn.com/problems/roman-to-integer

罗马数变整数
首先,我们应从罗马数字的计数规则入手探索解决问题的思路。在这里,我将罗马数字的计数规则分为正常特殊两类,其中,特殊的计数规则只有以下几种:IV = 4 , IX = 9 , XL = 40 , XC = 90 , CD = 400 , CM = 900
对下列两个典型示例进行研究:①:“XXVII”,②:“MCMXCIV”
对于①:“XXVII”,其转为整数为27。
其中X = 10, V = 5 , I = 1 ,不包含特殊计数规则数字。相当于是五个数字相加。因此可得1 + 1 + 5 + 10 + 10 = 27。
对于②:“MCMXCIV”,其转为整数为1994。
其中M = 1000 , C=100,M=1000,CM = 900, X =10,C=100XC = 90 , IV = 4。这个罗马数字中包含了三个特殊计数规则数字,相当于是四个数字相加,及可以看做"M CM XC IV"。

根据上述示例的研究,我们发现罗马数字转为整数可通过将各个罗马数字代表的整数加和得到,但是需要注意的是:特殊计数规则数字具有特殊性,需要专门研究。对于特殊字符,我们发现,其左侧罗马字母代表的数值总是比右侧罗马字母代表的数值小,并且两个字母所代表的最终数值等于右侧数值减左侧数值。即"CM"中,C < M,且CM = M - C = 1000 - 100 = 900。

根据这个思路,我们可以通过循环语句遍历输入的罗马数字,我们选择从后向前的遍历方法:当前一个数字小于后一个数字时,不构成特殊计数规则的罗马数字,则可以将其直接作为结果加到终值中;当前一个数字小于后一个数字时,构成特殊计数规则的罗马数字,需要进行特殊规则计算(后数减去前数),再将所得结果加到终值中。例:“XXVII”:遍历发现,无特殊字符,则结果为I+I+V+X+X = 1+1+5+10+10 = 27。 “MCM”:遍历发现,存在特殊数字CM,且CM=M-C=1000-100=900,则结果为CM+M=900+1000=1900。

综上,罗马数字转整数可由以下实现:

class Solution:def romanToInt(self, s: str) -> int:"""roman-to-integer"""roman_data = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}integer_result = 0for i in range(len(s)-1):reference_num1 = roman_data[s[i]]   #设定两个参考变量reference_num2 = roman_data[s[i+1]]if reference_num1 >= reference_num2:     #前数>后数,正常加和integer_result = integer_result + reference_num1else:    #前数<后数,为特殊规则计数情况integer_result = integer_result - reference_num1integer_result = integer_result + roman_data[s[-1]]  #从最后一个数依次向前加和return integer_result

学习过程中,欢迎指正。

Python学习日记——罗马数字转整数相关推荐

  1. Python学习日记-day1基础篇 字符 输出 注释

    Python学习日记-day1基础篇 字符 输出 注释 by北栀一刺 # -*- coding: utf-8 -*- """ Spyder EditorThis is a ...

  2. python学习日记(第一周)

    python学习日记(第一周) 前言: 无论出于什么目的,学个程序语言吧.之前学过一点点基础语法,然后就搁置了两年,日记仅作为个人记录,有问题还望不吝赐教 其实这玩意儿应该每次学一部分记录一部分的,好 ...

  3. Python LeetCode(13.罗马数字转整数)

    Python LeetCode(13.罗马数字转整数) 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M ...

  4. Python学习日记-pandas操作学习

    Python学习日记-pandas模块学习 根据需求筛选数据 绘制柱状图-利用pandas绘制 绘制柱状图-利用matplotlib绘制 绘制柱状图-两组数据比较 绘制柱状图-叠加柱状图 绘制饼状图 ...

  5. 菜菜的Python学习日记 | Python类实验代码分享

    系列索引:菜菜的Python学习日记 | Python从入门到入土详解 Python类实验代码分享 编写程序,实现以下功能. (1)创建员工类Employee,属性有姓名name.能力值ability ...

  6. 菜菜的Python学习日记 | 正则表达式你必须了解的知识点

    系列索引:菜菜的Python学习日记 | Python从入门到入土详解 文章目录 常用规则 Python对正则表达式的支持 常用规则 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat ...

  7. python学习日记2-3周

    python学习日记2-3周 怠惰怠惰 improt 导入 import phone.apple.iphone6 import phone.apple.iphone7 import phone.sam ...

  8. [Python学习日记] 文件与文件系统(一)

    [Python学习日记] 文件与文件系统(一) 目录 Python3 File(文件) 方法 open() 方法 file 对象 目录 Python3 File(文件) 方法 open() 方法 Py ...

  9. Python学习日记:求解由四个数字组成的四位数个数

    看见这个问题时,我们很容易想到我们学习过的排列组合知识点:显然用四个数字组成四位数(这些四位数互不相同)就是一个关于排列的问题:用数学的方法可以知道.那么怎么用Python运行解决呢?这就是本次学习日 ...

最新文章

  1. windows兼容Linux php,支持windows与linux的php计划任务的实现方法
  2. strncpy——字符串的复制(复制前n个字符)
  3. kdj指标主要看哪个值_什么是KDJ?KDJ指标如何使用
  4. leetcode练习(简单总结做过的题)
  5. 这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!
  6. 泰山行宫碧霞元君祠_临清市泰山行宫碧霞元君祠5月4号(农历三月三十日)举行大型泰山奶奶接驾法会...
  7. 春招已近,这份GitHub万星的ML算法面试大全请收下
  8. 基于ARM的SoC设计入门
  9. NB-IOT模块学习
  10. 七夕烟花c语言程序,C语言七夕必备神器,待那烟花灿烂时,依旧做个单身狗
  11. php 死链查询,网站最新死链查询和处理方法
  12. 【CV系列】Retinex理论模型及其应用
  13. 加州大学戴维斯分校 计算机科学,2020年加州大学戴维斯分校排名TFE Times美国最佳计算机科学硕士专业排名第43...
  14. mysql 查连接数,查看MySQL的连接数
  15. 日系IP的五大“坑”
  16. utf8字符集中漢字默認占三個字節
  17. xcode 使用xparse,xccov解析xcresult文件,查看代码覆盖率,导出日志,提取附件等
  18. xshell连接成功
  19. 【明哥版】Auto.Js环境搭建如何与Android手机建立连接教程
  20. Origin 中对曲线打定点,以及显示相应的坐标轴刻度

热门文章

  1. 名风SEO百度点击软件
  2. 平安夜,Python 送你一顶圣诞帽
  3. 豆豆趣事[2012年01月]
  4. 机器学习:python绘制P-R曲线与ROC曲线
  5. JS动态添加li标签
  6. linux 关机 shell,linux shell的关机命令是什么
  7. 51job(前程无忧官网)1万条招聘信息的爬取
  8. Vue组件之间传值的几种方法 (直接上代码)
  9. 字节跳动数据部门收入证明,月薪13.9万!果然还是程序员吃香!
  10. 获得CRC校验码的途径