郭峰博客 郭峰博客
首页
LeetCode
  • Algorithm
GitHub (opens new window)

挥码天涯

以梦为马,挥码天涯
首页
LeetCode
  • Algorithm
GitHub (opens new window)
  • 1.【简单】两数之和
  • 7.【简单】整数反转
  • 9.【简单】回文数
  • 11.【中等】回文数
  • 13.【简单】罗马数字转整数
    • 题目来源
    • 分析
    • 代码
  • 14.【简单】最长公共前缀
  • 15.【中等】三数之和
  • 19.【中等】删除链表的倒数第N个节点
  • 20.【简单】有效的括号
  • 21.【简单】合并两个有序链表
  • 26.【简单】排除数组中的重复项
  • 27.【简单】移除元素
  • 28.【简单】实现strStr
  • 35.【简单】搜索插入位置
  • 51. 【困难】数组中的逆序对.md
  • 58.【简单】最后一个单词的长度
  • 57.【中等】颜色分类
  • 100.【简单】相同的树
  • 168.【简单】缺失数字
  • 175.【简单】组合两表
  • 176.【简单】第二高的薪水.md
  • 176.【中等】第二高的薪水.md
  • 206.【简单】反转链表
  • 215.【中等】数组中的第K个最大元素
  • 875.【中等】爱吃香蕉的珂珂
  • LeetCode
feng.guo
2020-08-02
目录

13.【简单】罗马数字转整数

文章发布较早,内容可能过时,阅读注意甄别。

# 题目来源

题目来源

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 s

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
1
2
3
4
5
6
7
8

例如, 罗马数字 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:
1
2
3
输入: "IV"
输出: 4
示例 3:
1
2
3
输入: "IX"
输出: 9
示例 4:
1
2
3
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
1
2
3
4
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
1
2
3

# 分析

从给定的罗马数字的最低位挨个往前加就可以,只需要加一个小判断:如果前一位的罗马数字比当前的罗马数字小,就减去这个罗马数字。

例如:罗马数字为 CIV,我们先从 V 开始,V 对应的数字为 5,然后让 V 与 前一位 I 进行比较,发现 I 比 V 小,这时我们就要减去这个 I,所以,5 - 1 = 4。

接着让 I 与它的前一位进行比较,发现 C 比 I 大,所以就加上这个 C,所以结果为:5 - 1 + 100 = 104。

# 代码

func romanToInt(s string) int {
	var romanMap = map[byte]int{
		'I': 1,
		'V': 5,
		'X': 10,
		'L': 50,
		'C': 100,
		'D': 500,
		'M': 1000,
	}
	result := romanMap[s[len(s)-1]]
	for i := len(s) - 1; i > 0; i-- {
		preNum := romanMap[s[i-1]]
		if romanMap[s[i]] > preNum {
			result -= preNum
		} else {
			result += preNum
		}

	}
	return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
微信 支付宝
#数学
上次更新: 2024/03/07, 20:33:54

← 11.【中等】回文数 14.【简单】最长公共前缀→

最近更新
01
2.实现一个Stack
10-30
02
01.实现一个链表结构
10-30
03
博客导引
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式