将罗马数字转换为整数,反之亦然
#python #hacktoberfest #算法 #leetcode

Creed Ferguson (Unsplash)

的封面图像

介绍

这篇文章的灵感来自于我在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。因此,result10递增,而previousChar已更新为1
最后,值为5的第三个字符'V'将满足该条件,因为大于previousChar。因此,从result中减去1previousChar更新为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;
};