介绍
这篇文章的灵感来自于我在LeetCode上解决的两个挑战。其中一个是创建一个将罗马数字转换为整数的函数,第二个是创建一个函数以执行相反的功能。
如果您想在LeetCode上查看问题语句,请单击突出显示的标题。
Roman numeral to Integer
给出了一个字符串,其长度从1到15;它仅包含字符'I', 'V', 'X', 'L', 'C', 'D', 'M'
;可以保证,该字符串是[1, 3999]
范围内的有效罗马数字。因此,任务是将代表罗马数字的给定字符串转换为各自的整数。还要考虑以下陈述:
-
可以将
I
放置在V
(5)和X
(10)之前,以制造4和9。 -
可以将
X
放置在L
(50)和C
(100)之前,以使40和90. -
可以将
C
放置在D
(500)和M
(1000)之前,以使400和900。
讨论解决方案
我用来解决此挑战的方法是在字符串上迭代并执行符合问题语句中上述减法原理的条件,以返回与最终总和相对应的结果。
。条件说:如果当前字符大于上一个字符,则从结果中减去上一个字符值,否则将上一个字符的值递增到结果。
例如,如果我们考虑字符串s = 'XIV'
,第一个字符的'X'
的值为10
将满足条件,因为previousChar
变量使用0
初始化,那么result
仍然保留0
。
一旦1
的价值为1
,其价值为1
的第二个字符将无法满足条件,而1
不大于previousChar
,现在是10
。因此,result
被10
递增,而previousChar
已更新为1
。
最后,值为5
的第三个字符'V'
将满足该条件,因为大于previousChar
。因此,从result
中减去1
,previousChar
更新为5。
该代码用result = 9
完成循环,并最终将previousChar
的值递增到result
。因此,我们的最终result
变为14
。
解决方案
这是python解决方案的示例:
numbersDict = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
def romanToInt(s):
result = 0
previousChar = 0
for char in s:
if numbersDict[char] > previousChar:
result -= previousChar
else:
result += previousChar
previousChar = numbersDict[char]
result += previousChar
return result
Integer to Roman numeral
给出了1 <= num <= 3999
范围内的整数,任务是将其转换为罗马数字。
讨论解决方案
就像在上一个问题的解决方案中一样,首先我们创建一个dictionary
来映射整数及其各自的罗马数字。但是与以前的挑战不同,我们只绘制了单个字符的罗马数字,在这种情况下,我们还需要绘制整数4和9及其继任者及其继任者最多1000,为40、90、400和900。
对于这种情况,我也必须以降序订购元组数组,因为执行必要的检查时,这将与每次迭代相关。
因此,在第一步之后,我们创建一个函数来进行转换。这个想法类似于以前的挑战,除了现在,而不是将值递增到计数器上,直到我们迭代整个字符串,我们将从给定的数字中减去一个值,并将其各自的罗马数字串联到称为result
的字符串类型变量。<<<<<<<<<<<<<< /p>
解决方案
这是python解决方案的示例:
numbersDict = [
(1000, 'M'),
(900, 'CM'),
(500, 'D'),
(400, 'CD'),
(100, 'C'),
(90, 'XC'),
(50, 'L'),
(40, 'XL'),
(10, 'X'),
(9, 'IX'),
(5, 'V'),
(4, 'IV'),
(1, 'I')
]
def intToRoman(num):
remaining = num
result = ''
for integerValue, romanNumeral in numbersDict:
while remaining >= integerValue:
result += romanNumeral
remaining -= integerValue
return result
然后在JavaScript中使用相同的解决方案:
const numbersDict = [
[1000, 'M'],
[900, 'CM'],
[500, 'D'],
[400, 'CD'],
[100, 'C'],
[90, 'XC'],
[50, 'L'],
[40, 'XL'],
[10, 'X'],
[9, 'IX'],
[5, 'V'],
[4, 'IV'],
[1, 'I']
];
const intToRoman = (num) => {
let remaining = num;
let result = '';
for (let [integerValue, romanNumeral] of numbersDict) {
while (remaining >= integerValue) {
result += romanNumeral;
remaining -= integerValue;
}
}
return result;
};