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

news/2024/9/23 10:19:02/

文章目录

  • 问题描述
    • 示例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.ppmy.cn/news/871297.html

相关文章

行业 | 谷歌和亚马逊在赌场门口拉客,你上谁的船?

授权转载自公众号硅谷密探&#xff08;ID&#xff1a;guigudiyixian&#xff09; 看到这面镜子&#xff0c;你想到什么&#xff1f; 从外表上看&#xff0c;它是一款普通的浴室镜子&#xff0c;女生可以对着它描眉打扮&#xff0c;男生可以对着它剃须&#xff0c;喷发蜡。 只不…

在让元宇宙“圆梦”这条路上,交互技术卡在哪里了?

文|螳螂观察 作者|图霖 作为下一代互联网的可能形态&#xff0c;元宇宙掀起的热度仍在持续。 近日&#xff0c;由张艺谋等联合创办的VR公司北京当红齐天国际文化科技发展集团有限公司发生工商变更&#xff0c;新增小米关联公司瀚星创业投资有限公司、英特尔亚太研发有限公司…

【LeetCode热题100】打卡第36天:多数元素打家劫舍

文章目录 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍⛅前言 多数元素&#x1f512;题目&#x1f511;题解 打家劫舍&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍 ⛅前言 大家好&#xff0c;我是…

【状态估计】基于UKF法、AUKF法、EUKF法电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

8款瞬间提升逼格是电脑小软件!

大家电脑上一定都有很多软件&#xff0c;但是有的时候感觉操作起来并不让人很享受&#xff0c;也不是很便捷。今天&#xff0c;小编给大家整理了8款小众却实用的电脑软件&#xff0c;快点拿去提升逼格吧! 1.证照之星 证照之星是一款顶级的证件照制作方面的软件。其内嵌了复杂…

rocketmq使用mqtt协议

文章目录 前言一、安装rocketmq二、打包rocketmq-mqtt三、配置rocketmq-mqtt四、初始化操作五、启动六、测试 前言 rocketmq从4.9.3开始&#xff0c;可以兼容mqtt协议&#xff0c;需要安装编译一个rocketmq-mqtt工程&#xff0c;参考&#xff1a;https://rocketmq.apache.org/…

Load balancer does not contain an instance for the service xxx-service

文章目录 问题描述&#xff1a;1、排查微服务应用的名字2、排查注解FeignClient注解3、排查SpringBoot、SpringCloud、Spring Cloud Alibaba、以及Nacos版本4、微服务在共同的命名空间和分组中5、修改配置 问题描述&#xff1a; 在使用NacosSpringBootOpenFeign搭建项目时&…

嵌入式_一种非常简单实用的基于GD32的裸机程序框架

嵌入式_一种非常简单实用的基于GD32的裸机程序框架 搜索了一下关于GD或ST裸机程序的问题&#xff0c;网上有非常多也非常的例子&#xff0c;但是针对裸机开发的程序框架却比较少&#xff0c;这里简单整理了一下在项目中使用过的一种比较小巧便携的裸机程序框架&#xff08;确切…