LeetCode Integer to Roman

LeetCode解题之Integer to Roman

原题

将一个int型的数字转化为罗马数字,范围在1-3999。下面是罗马数字的介绍及基本规则:

罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:

  • 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3
  • 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12
  • 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9

注意点:

  • 基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个,放在大数的左边只能用一个
  • 不能把基本数字 V 、L 、D中的任何一个作为小数放在大数的左边采用相减的方法构成数目,放在大数的右边采用相加的方式构成数目时只能使用一个
  • V 和 X 左边的小数字只能用 Ⅰ
  • L 和 C 左边的小数字只能用 X
  • D 和 M 左边的小数字只能用 C

例子:

输入: num=99
输出: “XCIX”

解题思路

根据上面的规则和注意点可以看出,罗马字符及其组合能代表的数字有:

阿拉伯数字 罗马数字
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

只需要依次找出数字中包含的最大的可转化为罗马数字的数字即可。例如99,比小的数字是90,减去后剩下9,可以直接转换,所以结果是XCIX。

AC源码

class Solution(object):
    def intToRoman(self, num):
        """ :type num: int :rtype: str """
        nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        strings = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
        result = ''
        for i in range(len(nums)):
            while num >= nums[i]:
                num -= nums[i]
                result += strings[i]
        return result

# Test cases
if __name__ == "__main__":
    assert Solution().intToRoman(12) == "XII"
    assert Solution().intToRoman(21) == "XXI"
    assert Solution().intToRoman(99) == "XCIX"

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

你可能感兴趣的:(LeetCode,算法,python,罗马数字)