热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【打卡算法】13、罗马数字转整数算法解析

推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是小魔龙,Unit

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。


一、题目


1、算法题目

“将输入的罗马数字转化成整数。”

题目链接:
来源:力扣(LeetCode)

链接:13. 罗马数字转整数 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

罗马数字包含以下七种字符: I, V, X, L,C,DM


字符数值
I1
V5
X10
L50
C100
D500
M1000

例如, 罗马数字 2 写做 II ,即为两个并列的 112 写做 XII ,即为 X + II27 写做 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:
输入:num = "III"
输出:3

示例 2:
输入:num = "XLVIII"
输出:48
解析: XL = 40 , V = 5 , III = 3

示例 3:
输入:num = "MIVCMXCIV"
输出:4994
解析:MIV = 4000 , CM = 900 , XC = 90 , IV = 4

二、解题


1、思路分析

罗马数字转整数,主要分两种情况:


  • 一种是大数字在前,小数字在后,这种就可以将每个字符转化成一个值,累加即可。比如VI=5+1=6
  • 一种是小数字在大数字前的情况,需要根据规则减去小的数字,这种就可以将每个字符转化成一个值,若数字右侧的数字比自身大,就将该数字符号取反。比如 XIV = X - I + V =10 - 1 + 5 = 14

2、代码实现

模拟法:

根据解题思路,将输入的罗马数字依次比较,分成两种情况进行计算:

public class Solution
{public int RomanToInt(string s) {Dictionary<char, int> Values &#61; new Dictionary<char, int> { { &#39;I&#39;, 1 }, { &#39;V&#39;, 5 }, { &#39;X&#39;, 10 }, { &#39;L&#39;, 50 }, { &#39;C&#39;, 100 }, { &#39;D&#39;, 500 }, { &#39;M&#39;, 1000 } };int ans &#61; 0;int n &#61; s.Length;for (int i &#61; 0; i < n; &#43;&#43;i){int value &#61; Values[s[i]];if (i < n - 1 && value < Values[s[i &#43; 1]]){ans -&#61; value;}else{ans &#43;&#61; value;}}return ans;}
}

image.png

替换字符串

这是一种比较有趣的解法&#xff0c;利用C#的字符串替换的方法&#xff0c;将两个特殊字符替换成一个字符&#xff0c;然后字符转化成对应的唯一数字&#xff0c;进行加法即可。

public class Solution
{public int RomanToInt(string s) {s &#61; s.Replace("IV","Y");s &#61; s.Replace("IX","T");s &#61; s.Replace("XL","U");s &#61; s.Replace("XC","R");s &#61; s.Replace("CD","O");s &#61; s.Replace("CM","W");int sum &#61; 0;int i &#61; 0;for (i &#61; 0; i < s.Length; i&#43;&#43;){switch (s[i]){case &#39;M&#39;:sum &#43;&#61; 1000;break;case &#39;W&#39;:sum &#43;&#61; 900;break;case &#39;D&#39;:sum &#43;&#61; 500;break;case &#39;O&#39;:sum &#43;&#61; 400;break; case &#39;C&#39;:sum &#43;&#61; 100;break;case &#39;R&#39;:sum &#43;&#61; 90;break;case &#39;L&#39;:sum &#43;&#61; 50;break;case &#39;U&#39;:sum &#43;&#61; 40;break;case &#39;X&#39;:sum &#43;&#61; 10;break;case &#39;T&#39;:sum &#43;&#61; 9;break;case &#39;V&#39;:sum &#43;&#61; 5;break;case &#39;Y&#39;:sum &#43;&#61; 4;break;case &#39;I&#39;:sum &#43;&#61; 1;break;}}return sum;}
}

image.png


3、时间复杂度

时间复杂度 &#xff1a; O(n)

其中 n 是字符串 s 的长度。

空间复杂度&#xff1a; O(1)

计算量与输入数字的大小无关。


三、总结

这道题识构建一个字典记录所有罗马数字子串&#xff0c;然后根据大数字在前还是小数字在前分成两种情况&#xff0c;然后不同情况不同分析。

在解题的时候&#xff0c;就需要将所有的情况考虑到&#xff0c;不然的话转化的结果就会有些出入。


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
author-avatar
双鱼天脎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有