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

news2024/11/24 2:05:37

文章目录

  • 问题描述
    • 示例1
    • 示例2
  • 示例 3:
  • 示例 4:
  • 示例 5:
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
  • 详细分析
  • 运行效果截图
    • 调用示例
    • 运行结果
  • 完结

问题描述

在这里插入图片描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符数值
I1
V5
X10
L50
C100
D500
M1000
例如, 罗马数字 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

输入: 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))

运行结果

在这里插入图片描述

完结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c;同时…

centos环境搭建nsq集群

简言 1. nsq是go语言开发的实时的分布式消息处理平台&#xff0c;目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构&#xff0c;该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征 2. nsq官网地址 NSQ Docs 1.2.1 …

【详解】C语言冷门知识点之--位段

文章目录 一&#xff0c; 位段的解释二&#xff0c; 位段的声明和使用位段的声明&#xff1a;位段的使用&#xff1a; 三&#xff0c;位段的空间大小计算第一个例子&#xff1a;第二个例子&#xff1a;注意&#xff1a; 四&#xff0c; 位段的内存分配五&#xff0c;位段的跨平…

@Autowired 到底是怎么把变量注入进来的?

文章目录 1. Bean 的创建2. populateBean3. postProcessProperties3.1 findAutowiringMetadata3.2 inject3.3 doResolveDependency 4. 时序图 在 Spring 容器中&#xff0c;当我们想给某一个属性注入值的时候&#xff0c;有多种不同的方式&#xff0c;例如可以通过构造器注入、…

C++ string类型的基本使用方法

目录 1.定义和初始化string对象 2.string对象上的常用操作 在C中string是用来处理可变长字符串的&#xff0c;是C标准库中提供的类型&#xff0c;使用起来十分方便。同时C也支持C语言的字符数组来表示字符串。使用时记得包含string头文件。 1.定义和初始化string对象&#xf…

讨论下相亲交友小程序介绍红娘系统搭建的功能有哪些

首页内容 同城会员&#xff0c;VIP会员&#xff0c;线下会员&#xff0c;热文推荐&#xff0c;恋爱话术&#xff0c;爱情故事&#xff0c;恋爱宝典&#xff0c;相亲宝典&#xff0c;浪漫约会&#xff0c;相亲活动&#xff0c;地区、年龄筛选&#xff0c;用户动态&#xff0c;用…

(简单)剑指Offer || 056. 二叉搜索树中两个节点的和 Java

方法一&#xff1a;深度优先搜索哈希表 使用深度优先搜索的方式遍历整棵树&#xff0c;用哈希表记录遍历过的节点的值 对于一个值为x的节点&#xff0c;检查哈希表中是否存在k-x即可。如果存在对应的元素&#xff0c;那么我们就可以在该树上找到两个节点的和为k&#xff1b;否…

Idea 修改默认 Maven 为自己的

每次我们打开新项目时,都要去配置一遍 maven,很麻烦,其实可以去修改 idea 里面默认的 maven 配置,这样后面不管是打开新项目还是老项目,就都是用的自己的 maven 了. 1.文件->新项目设置->新项目的设置 File->Other Settings -> Settings for New Project 2.然后和…

【Unity开发必备】100多个 Unity 学习网址 资源 收藏整理大全【持续更新】

Unity 相关网站整理大全 众所周知&#xff0c;工欲善其事必先利其器&#xff0c;有一个好的工具可以让我们事半功倍&#xff0c;有一个好用的网站更是如此&#xff01; 但是好用的网站真的太多了&#xff0c;收藏夹都满满的(但是几乎没打开用过&#x1f601;)。 所以本文是对…

eclipse : sun.misc.BASE64Encoder找不到jar包的解决方法

sun.misc.BASE64Encoder找不到jar包 比较好的解决办法 按顺序依次操作&#xff1a; Windows -> Preferences -> Java -> Compiler -> Errors/Warnings。再按照顺序依次&#xff1a; Deprecated and trstricted API -> Forbidden reference (access rules): -&g…

量子力学的实验验证:双缝实验和贝尔不等式

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前几篇文章中&#xff0c;我们介绍了量子力学的起源、基本概念&#xff0c;以及叠加态、超级定位和量子纠缠等奇特现象。今天&#xff0c;我们将深入探讨量子力学的实验验证&#xff0c;重点介绍双缝实验和贝尔不等…

Android自定义圆环进度条/刻度仪表盘(单环单点带进度动画)

效果图: 1.自定义SleepDashBoardView /*** 睡眠刻度仪表盘*/ public class SleepDashBoardView extends View {private static final float START_ANGLE 135f;private static final float MAX_ANGLE 270f;private float progress 0;private float centerX;private float ce…

ValueError: check_hostname requires server_hostname怎么解决?

背景: 想使用pip安装某一个包。结果报错如上图绿框所示。 解决方法&#xff1a; 把代理&#xff08;梯子&#xff09;关掉就行了。

数据库应用:MySQL事务、存储引擎

目录 一、理论 1.事务 2.MySQL 存储引擎 二、实验 1.事务隔离级别 2.事务控制语句 三、总结 一、理论 1.事务 &#xff08;1&#xff09;概念 ① 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系…

XUbuntu22.04之解决ThindPad P15V风扇狂转的问题(一百八十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

深度学习标量、向量、矩阵、张量之间的区别与联系

文章目录 前言1、张量**注意**&#xff1a; 2、**标量** (scalar)&#xff1a;0阶的张量&#xff0c;0个轴&#xff0c;一个单独的数(整数或实数)&#xff1b;3、**向量**(vector)&#xff1a;1阶的张量&#xff0c;也叫矢量&#xff0c;1个轴&#xff0c;一个数组&#xff1b;…

elasticsearch学习入门+实战

学习链接1 基础概念 官网学习&#xff1a;地址 基本命令 PS&#xff1a;使用Apifox测试 查询所有索引库 添加索引库 添加时&#xff0c;加入分词器 添加时&#xff0c;加入记录属性值 查询获取索引库 删除索引库 添加文档 必须要在添加文档值的时候用【_doc】&a…

如何建立统一的自动化测试平台?

前面的文章中我们为大家介绍了中通科技自动化测试当时正在面临的一些困境。第一个是自动化测试框架太多&#xff0c;测试工程师在选择框架和脚本语言的时候很难统一&#xff0c;脚本编写门槛高。第二个是运行脚本的平台不统一&#xff0c;脚本运行时不够稳定。第三个是不同的Je…

TDengine数据建模

文章目录 1 引言2 数据建模3 数据建模的步骤4 创建库5 创建超级表实例 1 引言 工业互联网中有大量的时序数据需要存储和处理&#xff0c;tdengine是一个开源的、国产的、云原生时序数据库&#xff0c;tdengine不是基于其他第三方开源软件高级封装&#xff0c;是涛思数据完全自…

Java如何避免“重复代码”

一 前言 软件工程师和码农最大的区别就是平时写代码时习惯问题&#xff0c;码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。 业务同学抱怨业务开发没有技术含量&#xff0c;用不到设计模式、Java 高级特性、OOP&#xff0c;平时写代码都在堆 CRUD&…