算法练习:罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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 的范围内。
示例 1:
输入: "III"
输出: 3
示例 2:
输入: "IV"
输出: 4
示例 3:
输入: "IX"
输出: 9
示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
按照题目的描述,可以总结如下规则:
罗马数字由 I,V,X,L,C,D,M 构成;
当小值在大值的左边,则减小值,如 IV=5-1=4;
当小值在大值的右边,则加小值,如 VI=5+1=6;
由上可知,右值永远为正,因此最后一位必然为正。
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法
也可保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。
代码:
class Solution {public int romanToInt(String s) {int sum=0;int preNum = getValue(s.charAt(0));for(int i=1;i<s.length();i++){int num = getValue(s.charAt(i));if(preNum<num){sum -= preNum;}else{sum += preNum;}preNum = num;}sum +=preNum;return sum;}public int getValue(char ch){switch(ch){case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}}
}
代码二:
class Solution {public int romanToInt(String s) {s = s.replace("IV","a");s = s.replace("IX","b");s = s.replace("XL","c");s = s.replace("XC","d");s = s.replace("CD","e");s = s.replace("CM","f");int result = 0;for (int i=0; i<s.length(); i++) {result += which(s.charAt(i));}return result;}public int which(char ch) {switch(ch) {case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;case 'a': return 4;case 'b': return 9;case 'c': return 40;case 'd': return 90;case 'e': return 400;case 'f': return 900;}return 0;}
}
算法练习:罗马数字转整数相关推荐
- 【每日一算法】罗马数字转整数
微信改版,加星标不迷路! 每日一算法-罗马数字转整数 作者:阿广 阅读目录 1 题目 2 解析 1 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1 V 5 ...
- Java学习——算法(罗马数字转整数)
罗马数字转整数 1.题目 马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 ==> 数值 I ==> 1 V ==> 5 X ==> 10 L ==> ...
- 算法题---罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I : 1 V : 5 X : 10 L : 50 C : 100 D : 500 M : 1000 例如, 罗马数字 ...
- 【算法】罗马数字转整数
题目知识(拼写规则) 罗马数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000). 按照下述的规则可以表示任意正整数. 需要注意的是罗马数字中没有&qu ...
- java 算法学习 罗马数字转整数
1. switch -case 值匹配 2.sum+= a 等价于 sum= sum+a 3.字符串中前一个值与后一个值比较: 1. 取出第一个值 2. for循环依次取值 从第二个值开始 3. ...
- leetcode 罗马数字与整数的转换算法
介绍: 该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一 ...
- 【算法百题之四十二】罗马数字转整数
[算法百题之四十二]罗马数字转整数 大家好,我是Lampard~~ 很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙! 今天的问题是:罗马数字转整数 作为[整 ...
- 【算法练习】罗马数字转整数与整数转罗马数字
Leetcode 题目(难度:简单) 13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 ...
- Java算法罗马数字转整数
本文章只提供算法. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X ...
- 算法 罗马数字转整数
算法 罗马数字转整数 1.题目 2.方法 2.1枚举法(没得办法) 2.2map(大神级别) 1.题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 ...
最新文章
- Zora P1测评报告-Tsrjrc
- 中修改环境变量_嵌入式 Linux下永久生效环境变量bashrc
- 微信突然更新,新增了这些功能...
- 自然水体辐射特性与数值模拟 pdf_【技术·航天】定量评估贡献 精准决策未来 ——气象卫星数据在数值预报系统中贡献的定量评估...
- eclipse 将javaWeb项目转化成maven项目
- poi xwpf 转换成 html,Apache POI创建的docx文档无法转化成html
- 感谢Adobe,用上了Silverlight RC0版本
- 如何实现Punycode中文域名转码
- Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)...
- Matlab-杆单元整体刚度矩阵组装(有限元基础-曾攀)
- XAMPP最详细的安装及使用教程
- 【数理统计】卡方检验
- 综述国内外三维视觉测量系统的发展现状
- 生日快乐程序_7天获客6万,小程序助力品牌对抗“行业寒冬”
- CRAFT:Character region awareness for text detection 论文阅读
- 副业怎么样通过手游达到月入过万
- 系统集成项目管理工程师主要公式
- 爱之树(二叉树建树+搜索)
- 最大子串和【浙江工商大学oj】【详细注释版】
- 【测验1 编程题】: Python基本语法元素 (第1周)