罗马数字转整数
题目
罗马数字包含以下七种字符: 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 <= 15s仅含字符 ('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
}