题目描述【简单】
罗马数字包含以下七种字符:
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 。
题目地址:地址
正式分析
这道题是昨天题的反向解答题,我们根据题目描述中的这段:
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如
4
不写做IIII
,而是IV
。数字1
在数字5
的左边,所表示的数等于大数5
减小数1
得到的数值4
。
如果我们在循环输入字符时,判断当前字符的数字
小于 后一位字符的数字
,则将当前数字做减法记到最终值上,即可完成题目要求
具体代码
const romanLetter = 'M_CM_D_CD_C_XC_L_XL_X_IX_V_IV_I'.split('_')
const romanNumber = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
function romanToInt(s: string): number {
const length = s.length
let result = 0
const getRomanNumber = (letter: string): number | undefined => romanNumber[romanLetter.indexOf(letter)]
for (let i = 0; i < length; i++) {
const currNum = getRomanNumber(s[i])
const nextNum = getRomanNumber(s[i + 1]) ?? 0
if (currNum < nextNum) {
result -= currNum
} else {
result += currNum
}
}
return result
};
TS AC,执行用时:172ms
, 在所有 TypeScript
提交中击败了 66%
的用户
最后
如果我在哪里写的有问题,欢迎指出,共同进步,谢谢阅读~