首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构与算法 -2 :罗马数字与整数的相互转换

数据结构与算法 -2 :罗马数字与整数的相互转换

作者头像
石璞东
发布于 2020-05-19 16:36:36
发布于 2020-05-19 16:36:36
64700
代码可运行
举报
文章被收录于专栏:石璞东 | haha石璞东 | haha
运行总次数:0
代码可运行

【Leetcode】题目描述

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
字符          数值
 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 到 3999 的范围内。

示例:

  • 整数转罗马数字[1]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
  • 罗马数字转整数[2]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

说下规则

四个规则:

  1. 相同的数字连写, 所表示的数等于这些数字相加得到的数。如 XXX表示 30
  2. 小的数字在大的数字的右边, 所表示的数等于这些数字相加得到的数 如VIII 表示8
  3. 小的数字(限于I, X, C)在大的数字的左边, 所表示的数等于大数减去小的数:如IV 表示4
  4. 在一个数的上面画一条横线, 表示这个数增值1000倍(由于题目只考虑4000以内的数,所以这条规则不用考虑。)

五个组数规则:

  1. I, X, C:最多只能连用3个, 如果放在大数的左边,只能用1个
  2. V, L, D: 不能放在大数的左边,只能使用一个
  3. I 只能用在V和X的左边。IV表示4, IX表示9
  4. X只能放在L,C左边。XL 表示40, XC表示90
  5. C只能用在D,M左边。CD 表示400, CM表示900

解题思路

  • 整数转罗马数字[1]

此种题目较为复杂,因为不知道大数在左边还是右边,所以存在两种情况,需要判断一下:

  • 小的数在左边,大的数字在右边(例:IV,参照上述6种特殊情况)
  • 小的数在右边,大的数字在左边(例:VI表示6,即所有数字相加之和)

  • 罗马数字转整数[2]

通过组合数字来拆分,使程序能够实现连加的方法。举个栗子:给定一个已知数字,假设为10,然后再给定一组数字(即数组[15,8,4,2,1]),组合数字的意思就是:使用当前所给值10与所给数组中所有元素进行比较,找出第一个小于或等于所给当前值10的数组元素,即8,然后从所给已知值中减去该值,用余数与数组中的下一个元素继续进行比较,同理找到小于或者等于该余数的值,然后继续循环往复,直到找不到满足该条件(当前余数不小于等于数组元素的时候)时,给定数字即为所有被减掉的数字之和。

画个图更简单:

图1.1 图解转换过程

代码展示

  • 整数转罗马数字[1]
代码语言:java
AI代码解释
复制
class Solution {
  public:
      int romanToInt(string s) {
          int tagVal[256];
          tagVal['I']=1;
          tagVal['V']=5;
          tagVal['X']=10;
          tagVal['L']=50;
          tagVal['C']=100;
          tagVal['D']=500;
          tagVal['M']=1000;
          int val=0;
          for(int i=0;i<s.length();i++){
              if(i+1>=s.length()||tagVal[s[i+1]]<=tagVal[s[i]]){
                  val += tagVal[s[i]];
              }else{
                  val -= tagVal[s[i]];
              }
          }
          return val;
      }
  };
  • 罗马数字转整数[2]
代码语言:java
AI代码解释
复制
class Solution {
  public:
      string intToRoman(int num) {
          if(num<=0) return "";
          string ret = "";
          static int number[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
          static string flags[13]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
          for (int i=0;i<13&&num>0;i++){
              if (num<number[i]) continue;
              while(num>=number[i]){
                  num -= number[i];
                  ret += flags[i];
              }
          }
          return ret;
      }
  };

本文总结

在本文中,我们实际上讲解了Leetcode上的两个题目(即整数转罗马数字[1]罗马数字转整数[2]),我们给出了本题详细的解题思路,并通过一个简单的图示对其做了更为透彻清晰的说明,在最后我们通过C++对这两个题目进行了代码实现,小伙伴们学会了吗?快去实现一下吧!

参考资料

[1]

【Leetcode】整数转罗马数字: https://leetcode-cn.com/problems/integer-to-roman/?utm_source=LCUS&utm_medium=ip_redirect_q_uns&utm_campaign=transfer2china

[2]

【Leetcode】罗马数字转整数: https://leetcode-cn.com/problems/roman-to-integer/?utm_source=LCUS&utm_medium=ip_redirect_q_uns&utm_campaign=transfer2china

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 hahaCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Leetcode12 整数转罗马数字
字符 数值 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 。
Swingz
2020/12/18
2810
☆打卡算法☆LeetCode 13、罗马数字转整数 算法解析
链接:13. 罗马数字转整数 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
3040
☆打卡算法☆LeetCode 13、罗马数字转整数  算法解析
【leetcode刷题】20T8-罗马数字转整数
https://leetcode-cn.com/problems/roman-to-integer/
木又AI帮
2020/02/16
3440
LeetCode-12 整数转罗马数字
今天我们学习第12题整数转罗马数字,这是一道中等题。下面我们看看这道题的题目描述。
用户3470542
2019/06/26
4940
LeetCode-12 整数转罗马数字
经典面试题:整数和罗马数字互转(下集)
这是 LeetCode 上的「13. 罗马数字转整数」,难度经典面试题:整数和罗马数字互转(上集)为 Easy。
宫水三叶的刷题日记
2021/02/26
4960
【LeetCode】(No.012&013) 整数与罗马数字的相互转换
好几天没有更新LeetCode的刷题了,12和13题是整数与罗马数字的相互转换,今天用一篇文章对这个问题做一下解析。
PM小王
2019/07/02
4280
【LeetCode】(No.012&013) 整数与罗马数字的相互转换
Leetcode-12. 整数转罗马数字
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
悠扬前奏
2020/06/02
2860
Leetcode 13. 罗马数字转整数
我的思路很简单,一般情况下,罗马数字里面数字小的在后面(右边),而大的数字在前面(左边),如果输入的字符串中字母排序均满足该种情况,可以将每个字符视作一个单独的值,累加即可,比如:
Regan Yue
2023/07/10
2050
Leetcode13 罗马数字转整数
字符 数值 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 。
Swingz
2020/12/18
3170
Leetcode13  罗马数字转整数
LeetCode-13 罗马数字转整数
今天我们学习第13题罗马数字转整数,这是一道简单题,是我们昨天学习的LeetCode-12 整数转罗马数字(点击跳转)的逆过程。下面我们看看这道题的题目描述。
用户3470542
2019/06/26
5580
LeetCode-13 罗马数字转整数
LeetCode 13. 罗马数字转整数
字符 数值 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 。
freesan44
2020/02/25
4060
☆打卡算法☆LeetCode 12、整数转罗马数字 算法解析
链接:https://leetcode-cn.com/problems/integer-to-roman/
恬静的小魔龙
2022/08/07
2570
☆打卡算法☆LeetCode 12、整数转罗马数字  算法解析
C#版 - Leetcode 12. 整数转罗马数字 - 题解
在线提交: https://leetcode.com/problems/integer-to-roman/
Enjoy233
2019/03/05
1.3K0
【每日leetcode】35.罗马数字转整数
字符 数值 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 。
一条coding
2021/09/15
2070
LeetCode【12】-- 整数转罗马数字
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。
秦怀杂货店
2022/02/15
2370
java字符串练习题5、罗马数字转整数
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
红目香薰
2023/01/13
3790
java字符串练习题5、罗马数字转整数
12. 整数转罗马数字
例如, 罗马数字 2 写做 II,即为两个并列的 1。12 写做 XII,即为 X+ II。 27 写做 XXVII, 即为 XX+ V+ II。
GeekLiHua
2025/01/21
780
LeetCode 12/13 罗马数字与整型互转(哈希,贪心)
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
Michael阿明
2020/07/13
4920
LeetCode 12/13 罗马数字与整型互转(哈希,贪心)
【leetcode刷题】20T7-整数转罗马数字
https://leetcode-cn.com/problems/integer-to-roman/
木又AI帮
2020/02/16
3640
leetcode-12-整数转罗马数字
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
chenjx85
2018/08/16
3170
推荐阅读
相关推荐
Leetcode12 整数转罗马数字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验