【力扣算法13】之 12. 整数转罗马数字 python

简介: 【力扣算法13】之 12. 整数转罗马数字 python

问题描述

罗马数字包含以下七种字符: 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
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10

示例1

输入: num = 3

输出: “III”

示例2

输入: num = 4

输出: “IV”

示例 3:

输入: num = 9

输出: “IX”

示例 4:

输入: num = 58

输出: “LVIII”

解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994

输出: “MCMXCIV”

解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示

  • 1 <= num <= 3999

思路分析

首先,我们将罗马数字的字符和对应的数值存储在两个数组中。roman_chars数组存储了罗马数字的字符,roman_values数组存储了对应的数值。例如,'I’对应的数值是1,'V’对应的数值是5,以此类推。

接下来,我们创建一个空字符串result,用于存储转换后的罗马数字。

然后,我们使用贪心算法进行转换。贪心算法的思想是每次选择当前最优的解决方案,以达到全局最优的结果。

我们从最大的数值开始,也就是从1000开始遍历roman_values数组,因为罗马数字的表示是按照从大到小的顺序排列的。

在每一次循环中,我们判断当前的数值是否小于等于给定的整数num

  • 如果是,说明当前的罗马数字可以加入到结果字符串中。
  • 首先将对应的罗马数字字符添加到result中。
  • 然后将该数值从给定的整数num中减去,更新num的值。
  • 通过使用while循环,可以多次将同一个罗马数字字符添加到result中,直到num小于当前的数值。
  • 这样能够保证我们使用尽可能多的最大的罗马数字字符来表示给定的整数。

如果当前的数值不满足条件,即大于给定的整数num,则继续遍历下一个数值,并重复上述步骤。

最后,当遍历完所有的数值之后,我们得到了转换后的罗马数字。

最后返回最终的结果字符串result

通过这样的贪心算法思路,我们可以将给定的整数转换为相应的罗马数字。

代码分析

首先我们创建了一个Solution类,并在该类中定义了intToRoman方法来实现整数到罗马数字的转换。方法的参数是一个整数num,表示需要转换的整数。

在方法中,我们定义了两个数组roman_charsroman_values,分别用来存储罗马数字的字符和对应的数值。

接下来,我们创建了一个空字符串result,用于存储转换后的罗马数字。

然后,我们使用贪心算法进行转换。

通过一个循环遍历roman_values数组,我们可以依次检查每个罗马数字的数值是否满足要求。从最大的数值开始,我们首先检查是否当前的数值roman_values[i]小于等于给定的整数num

如果是,说明当前的罗马数字可以加入到结果字符串中。

首先,我们将对应的罗马数字字符roman_chars[i]添加到result中。

然后,我们从给定的整数num中减去该数值roman_values[i],更新num的值。

此时,我们使用了一个while循环,不断将同一个罗马数字字符添加到result中,直到给定的整数num小于当前的数值roman_values[i]

通过这样的方式,我们能够使用尽可能多的最大的罗马数字字符来表示给定的整数。

如果当前的数值roman_values[i]不满足条件,即大于给定的整数num,则继续遍历下一个数值,并重复上述步骤。

最终,当我们遍历完所有的数值之后,我们得到了转换后的罗马数字。

最后,我们返回最终的结果字符串result

通过这样的实现,我们可以将给定的整数转换为相应的罗马数字。


完整代码


class Solution(object):
     def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        # 定义罗马数字字符和对应的阿拉伯数字值
        roman_chars = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
        roman_values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        # 初始化结果字符串
        result = ""
        # 遍历罗马数字字符和对应的阿拉伯数字值
        for i in range(len(roman_values)):
            # 当输入的数字大于等于当前罗马数字对应的阿拉伯数字值时
            while num >= roman_values[i]:
                # 减去当前罗马数字对应的阿拉伯数字值
                num -= roman_values[i]
                # 将当前罗马数字字符添加到结果字符串中
                result += roman_chars[i]
        # 返回转换后的罗马数字字符串
        return result

详细分析

class Solution(object):
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """

这段代码定义了一个名为Solution的类,其中包含了一个名为intToRoman的方法。intToRoman方法接受一个整数num作为参数,并返回一个字符串。

# 罗马数字字符表
    roman_chars = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
    # 对应的数值表
    roman_values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
    # 存储结果的字符串
    result = ""

这段代码定义了两个数组roman_charsroman_values,分别用于存储罗马数字的字符和对应的数值。result是一个空字符串,用于存储转换后的罗马数字。

# 遍历数值表
    for i in range(len(roman_values)):
        # 检查当前的数值是否小于等于给定的整数
        while num >= roman_values[i]:
            # 如果满足条件,将对应的罗马数字字符添加到结果字符串中
            result += roman_chars[i]
            # 从给定的整数中减去对应的数值
            num -= roman_values[i]

这段代码使用循环来遍历roman_values数组中的每个数值。在每次循环中,我们检查当前的数值roman_values[i]是否小于等于给定的整数num。如果满足条件,我们将对应的罗马数字字符roman_chars[i]添加到结果字符串result中,并从给定的整数num中减去该数值。

# 返回转换后的罗马数字字符串
    return result

最后,我们返回转换后的罗马数字字符串result

通过这个算法,我们可以将给定的整数转换为相应的罗马数字。


运行效果截图


调用示例


solution = Solution()
num1 = 3
num2 = 4
num3 = 9
num4 = 58
num5 = 1994
print(solution.intToRoman(num1))
print(solution.intToRoman(num2))
print(solution.intToRoman(num3))
print(solution.intToRoman(num4))
print(solution.intToRoman(num5))

运行结果


完结


相关文章
|
10天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
41 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
10天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
36 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
10天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
49 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
15天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
24天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
26 3
|
27天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
72 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
4月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【7月更文挑战第22天】在大数据领域,Python算法效率至关重要。本文深入解析时间与空间复杂度,用大O表示法衡量执行时间和存储需求。通过冒泡排序(O(n^2)时间,O(1)空间)与快速排序(平均O(n log n)时间,O(log n)空间)实例,展示Python代码实现与复杂度分析。策略包括算法适配、分治法应用及空间换取时间优化。掌握这些,可提升大数据处理能力,持续学习实践是关键。
125 1
|
5月前
|
存储 机器学习/深度学习 算法
Python算法基础教程
Python算法基础教程
31 0
下一篇
无影云桌面