罗马数字转整数
题目
罗马数字包含以下七种字符: 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 <= s.length <= 15
s
仅含字符 ('I'
,'V'
,'X'
,'L'
,'C'
,'D'
,'M'
)- 题目数据保证
s
是一个有效的罗马数字, 且表示整数在范围[1, 3999]
内
示例
输入: 'LVIII'
输出: 58
解释: (L = 50), (V = 5), (III = 3)
输入: 'MCMXCIV'
输出: 1994
解释: (M = 1000), (CM = 900), (XC = 90), (IV = 4)
题解
- JavaScript
- Rust
先根据 6
种特殊情况将罗马数字切成数组, 再根据 romaMap
将所有的元素累加和.
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
const romaMap = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
IV: 4,
IX: 9,
XL: 40,
XC: 90,
CD: 400,
CM: 900,
}
const romaSplit = s.match(/(CM)|(CD)|(XC)|(XL)|(IX)|(IV)|(\w)/g)
return romaSplit.reduce((acc, val) => acc + romaMap[val], 0)
}
use std::collections::HashMap;
pub fn roman_to_int(s: String) -> i32 {
let map = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
.iter()
.zip([1, 5, 10, 50, 100, 500, 1000])
.collect::<HashMap<_, _>>();
s.chars()
.rev()
.fold((0, 0), |acc, val| {
let num = map[&val];
(
if num < acc.1 {
acc.0 - num
} else {
acc.0 + num
},
num,
)
})
.0
}