当前位置:网站首页>LeetCode50天刷题计划(Day 9—— 整数转罗马数字(20.40-22.10)
LeetCode50天刷题计划(Day 9—— 整数转罗马数字(20.40-22.10)
2022-08-01 14:45:00 【国际知名观众】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、题目
整数转罗马数字
罗马数字包含以下七种字符: 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:
输入: 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
二、思路
想过贪心算法,但是不会写 QAQ,现在觉得算法题最重要的就是理解算法的意思。最后写的是:
把每个输入看成四位数,一位一位处理:如果是4/5、9、直接输出,处理下一位;如果是6/7、8、先输出5,然后和1/2、3一起输出n个1
一上去就打表模拟,没啥意思
以下是贪心的思路:
首先,我们用来确定罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号值。
因此,可以使用一个从大到小顺序排列的哈希表:
hashmap = {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’}
遍历这个哈希表的同时,看此值能否加入字符串中(当前剩余值比表中此项大即可加入)
时间复杂度:O(1)。最坏条件下,循环的次数为哈希表的长度。
空间复杂度:O(1)。
三、代码
1.python
class Solution:
def intToRoman(self, num: int) -> str:
return_str = ""#返回字符串
d=[{
'1':'M'},{
'1':'C','4':'CD','5':'D','9':'CM'},{
'1':'X','4':'XL','5':'L','9':'XC'},{
'1':'I','4':'IV','5':'V','9':'IX'}]
s="0"*(4-len(str(num)))+str(num) #补成四位
for i in range(4):#依次遍历每一位
temp=int(s[i])#本轮数字
if(s[i]=='0'):#0跳过
continue
#处理459
if(i>0 and s[i] in ['4','5','9']):#第一轮不必,千位最多是三,若是特殊数字,直接可以加上
return_str+=d[i][s[i]]
continue
#处理6和7,加入一个5
if(temp>5):
temp=temp-5
return_str+=d[i]['5']
#处理temp(1/2/3和6/7剩下的)
return_str+=temp*d[i]['1']
return return_str

2.python
class Solution:
def intToRoman(self, num: int) -> str:
#定义哈希表
hashmap = {
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'}
#定义返回值
re_str=''
for i in hashmap: #遍历字典的键
if(num>=i):
count=num//i #要几个当前字母
re_str += count * hashmap[i] #加入
num -= count*i #更新num值
return re_str

边栏推荐
- 考研大事件!这6件事考研人必须知道!
- Typora报错:This beta version of Typora is expired
- The problem that the column becomes indexed after pd groupby and the aggregation column has no column name
- 如何使用 Mashup 技术在 SAP Cloud for Customer 页面嵌入自定义 UI
- 牛客刷SQL--6
- ECCV 2022|R2L: 用数据蒸馏加速NeRF
- 性能优化——渲染优化笔记
- 170页6万字智慧能源管理平台建设方案书
- pd groupby后列变索引以及聚合列无列名的问题
- redis主从同步方式(redis数据同步原理)
猜你喜欢

SQL query data and sorting

final关键字的作用 final和基本类型、引用类型

OpenSSL SSL_read: Connection was reset, errno 10054

String comparison size in MySQL (date string comparison problem)

gconf/dconf实战编程(2)利用gconf库读写配置实战以及诸多配套工具演示

Stored procedures in MySQL (detailed)
![[Binary Tree] Path Sum II](/img/ed/741b213f620f19975bdb479de015b1.png)
[Binary Tree] Path Sum II

十九届浙大城院程序设计竞赛 F.Sum of Numerators(数学/找规律)

信息录入率百分百上海强化施工现场建筑工人实名制管理

MySQL中根据日期进行范围查询
随机推荐
龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权
gconf/dconf实战编程(2)利用gconf库读写配置实战以及诸多配套工具演示
SSM入门
什么是闭包?
输出0-1背包问题的具体方案 ← 利用二维数组
VIM实用指南(-1)VIM的前世今生
[LiteratureReview]Optimal and Robust Category-level Perception: Object Pose and Shape Estimation f
What is a closure?
SQL每日一练(牛客新题库)——第2天: 条件查询
搭建ntp时间服务器(安装sql2000配置服务器失败)
The role of the final keyword final and basic types, reference types
立新能源深交所上市:市值55亿 哈密国投与国有基金是股东
HTB-Shocker
分布式中的远程调用
The default database main key, foreign key, and the only key index
性能优化——渲染优化笔记
考研大事件!这6件事考研人必须知道!
安培龙IPO过会:年营收5亿 同创伟业与中移创新是股东
Digicert EV证书签名后出现“证书对于请求用法无效”的解决方案
Wovent Bio IPO: Annual revenue of 480 million pension fund is a shareholder