轻松一刻——LeetCode题目13:罗马数字转整数
原题描述
+
罗马数字包含以下七种字符: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
原题链接:https://leetcode-cn.com/problems/roman-to-integer
思路解析
+
我们从题干得知,在罗马数字中,大部分都是小的数字在大的数字右边,但是也有反例,比如IV=4,XC=90这种情况。
如果先不考虑这种反例,那么转换规则将非常简单——直接扫描字符串查表,并累加就能得到结果,比如:LVIII从左到右依次查表得到50,5,1,1,1,我们只要把他们累加即可。
如果我们考虑像IV,XC这种小的数字在大的数字左边的情况,那么上述的规则就不成立了,因为IV=5-1,而不是5+1。没错,其实这个相对顺序影响的就是正负性。
所以我们只需要从右往左逐个扫描罗马字符串,如果发现当前数字比前一个数字小,我们就减去当前数字;反之,则累加即可,因此实际上它是个最朴素的遍历就可以解决的问题。
复杂度分析
+
- 时间复杂度:
- 空间复杂度:
计算步骤
+
这道题太简单了,我就不列计算步骤了,直接看代码就可以懂~
C++参考代码
+
class Solution {
public:
int romanToInt(string s) {
int res = 0;
map<char, int> table = {
{'I', 1}, {'V', 5}, {'X', 10},
{'L', 50}, {'C', 100}, {'D', 500},
{'M', 1000}
};
int next = 0;
for (int i = s.size() - 1; i >= 0; --i) {
int digit = table[s[i]];
if (digit < next) res -= digit;
else res += digit;
next = digit;
}
return res;
}
};
- Promise原理解析与实现
- Spring Cloud 覆写远端的配置属性
- C语言心得一
- .NET Core装饰模式和.NET Core的Stream
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
- 多行图片hover加边框兼容IE7+
- Debian JDK安装及配置
- Python With-As
- 用 TensorFlow 创建自己的 Speech Recognizer
- Shell利剑之xargs和time
- Shell利剑之export、read和history
- css sprite 调整大张图片中小图标的大小
- Learn Git One
- Docker系列教程04-Docker镜像常用命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Vue进阶】——如何实现组件属性透传?
- Go语言入门(九) 文件操作
- zookeeper完整详细版
- redis学习(十九)
- Android开发6年,互联网寒冬公司倒闭后,耗时3个月北上广求职,终拿到头条Offer!
- 直播软件开发如何使用FFMPEG推流并保存在本地
- react-router学习笔记
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- BFE.dev前端刷题 23. 实现一个sum()方法
- 彻底深刻理解js原型链之prototype,proto以及constructor(一)
- SAP Spartacus取cart的HTTP请求
- 记一次Netty连接池FixedChannelPool连接未释放问题的排查总结
- 神经网络中的蒸馏技术,从Softmax开始说起
- NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
- Angular module加载的原理研究