LeetCode小白菜笔记[4]:Roman to Integer

2023-12-15 18:59

本文主要是介绍LeetCode小白菜笔记[4]:Roman to Integer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode小白菜笔记[4]:Roman to Integer

13. Roman to Integer [Easy]

题目:Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

呃。。。这次题目很简单也很实用。而且发现需要恶补一下常识了…因为居然对罗马数字太不熟悉,只认识I,V,X 。因为很少见到较大数字的罗马数字表示,感觉日常一般都是用罗马数字作序数,因此也不会太大。而且对很多规则也不清楚。所以先补充一下关于罗马数字的常识:

Roman numerals (罗马数字)


这里写图片描述

罗马数字起源于古罗马并且直到晚期中世纪还是一种在欧洲流行的计数方法。罗马数字体系有7个拉丁字母作为元素,通过对其进行组合计数:

这里写图片描述

罗马帝国衰亡之后很长时间内,罗马数字仍然存在,直到从14世纪开始,才逐渐被阿拉伯数字取代。

基本的计数方法如下:
1-10之间的数字的最基本的表示方式(罗马数字是十进制的)
I, II, III, IV, V, VI, VII, VIII, IX, X
基本原则,在有两种符号的情况下,小数在左为减法(subtraction notation),小数在右为加法。注意,4和9的表示方法通常是以减法表示的。
然后10到100的表示为:
X, XX, XXX, XL, L, LX, LXX, LXXX, XC, C.
实际上就是用 X,L,C 分别替换了10以内时候的 I,V,X 。同理,100到1000为:
C, CC, CCC, CD, D, DC, DCC, DCCC, CM, M.
同时含有hundreds,tens,units的数字按照降序从左到右排列,和阿拉伯数字相同。但是不需要对缺失某一数量级的位数的位置占位。举几个栗子:(栗子来自wikipedia)

  • 1776 as MDCCLXXVI, the date written on the book held by the Statue of Liberty.
  • 1954 as MCMLIV, as in the trailer for the movie The Last Time I Saw Paris
  • 1990 as MCMXC, used as the title of musical project Enigma’s debut album MCMXC a.D., named after the year of its release.
  • 2014 as MMXIV, the year of the games of the XXII (22nd) Olympic Winter Games (in Sochi)

其他的规则如:左边减去的数字只能是I,X,C,不能是5,50,500之类;而且左键不可跨越位数,即只能相差一个量级,如 99 为XCIX(即 (100-10) + (10-1) ),而不能是IC(100 - 1)。跨越了位数。错误;另外,左减最多一个,右加最多三个。以及上方加线或者下标加M表示乘以1000。(突然明白为何这道题目限制输入范围,因为4000及以上需要用5000-1000来表示,无法应用上述规则啦)

基本规则就是以上,根据我们已知的规则,可以看出,在一个罗马数字中,大数一般是在高位,小数在低位,只有当小数为1,10,100并与后面的数字作减法的时候,才可以小数在大数前面。如:
MCMLIV = 1000 + (1000-100) + 50 + (5-1)
所以一种思路是:在字符串中检测右边比自己小的位置,将该位置的数加上负号,最后直接求和。(由于根据规则左减最多只有一位,所以只比较相邻两位即可)。另一种思路为,从高到低依次取数,如果下一个比现在大,就减去现在的数,否则就加上,最后一个肯定是加。emmm…….貌似这两种本质上也没啥区别。
当然,最先要建立一个码本将str存成list,每个元素都转成int。
代码如下:

class Solution(object):def romanToInt(self, s):""":type s: str:rtype: int"""romandict = dict({'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000})m = []for i in range(len(s)):m.append(romandict[s[i]])if (m[i] > m[i-1] and i > 0 ):m[i - 1] = - m[i - 1]return sum(m)

灰常顺利的通过了。。。但是好像有点慢。

这里写图片描述

class Solution(object):def romanToInt(self, s):""":type s: str:rtype: int"""romandict = dict({'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000})introman = 0for i in range(0,len(s)-1):if (romandict[s[i]] < romandict[s[i+1]]):introman -= romandict[s[i]]else:introman += romandict[s[i]]return introman + romandict[s[-1]]

这个的结果:

这里写图片描述

稍稍好一些。

总结
如果能每一步直接计算且不需要返回中间变量的话就尽量直接计算,比如上述直接输出sum即可,不需要先转成带正负号的整数list。
python中的dict的key这里是字符串,要用 ‘ I ’ 而不是 I 。以及python里没有switch-case 语句 ,可能是因为有字典吧,可以实现类似的功能。
以及,平时要积累基本常识,免得到时候罗马数字都认不全「手动捂脸」。

THE END

星期一, 11. 十二月 2017 12:11上午

这篇关于LeetCode小白菜笔记[4]:Roman to Integer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/497514

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2