Leetcode简单:13. 罗马数字转整数

python——罗马数字转换 类型:字典。 阅读详情

题目:罗马数字转整数

  • 题号:13
  • 难度:简单
  • https://leetcode-cn.com/problems/roman-to-integer/

罗马数字包含以下七种字符: 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, 即为X + X + 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:

输入: s = "III"
输出: 3

示例 2:

输入: s = "IV"
输出: 4

示例 3:

输入: s = "IX"
输出: 9

示例 4:

输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
  • 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
  • IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
  • 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。

实现

第一种:直接法

根据“罗马数字中小的数字在大的数字的右边”以及六种特殊情况的规则直接去写代码。

public class Solution
{
    public int RomanToInt(string s)
    {
        int result = 0;
        int count = s.Length;
        int i = 0;
        while (i < count)
        {
            char c = s[i];
            int move = 0;
            switch (c)
            {
                case 'I':
                    result += PreI(i, s, ref move);
                    break;
                case 'V':
                    result += 5;
                    move = 1;
                    break;
                case 'X':
                    result += PreX(i, s, ref move);
                    break;
                case 'L':
                    result += 50;
                    move = 1;
                    break;
                case 'C':
                    result += PreC(i, s, ref move);
                    break;
                case 'D':
                    result += 500;
                    move = 1;
                    break;
                case 'M':
                    result += 1000;
                    move = 1;
                    break;
            }
            i += move;
        }
        return result;
    }
    private int PreI(int index, string s, ref int move)
    {
        //I  1
        //IV 4
        //IX 9
        //II 2
        int result = 0;
        int count = s.Length;
        if (index + 1 < count)
        {
            char c = s[index + 1];
            switch (c)
            {
                case 'V':
                    result = 4;
                    move = 2;
                    break;
                case 'X':
                    result = 9;
                    move = 2;
                    break;
                case 'I':
                    result = 2;
                    move = 2;
                    break;
            }
        }
        else
        {
            result = 1;
            move = 1;
        }
        return result;
    }

    private int PreX(int index, string s, ref int move)
    {
        //X 10
        //XL 40
        //XC 90
        int result = 0;
        int count = s.Length;
        if (index + 1 < count)
        {
            char c = s[index + 1];
            switch (c)
            {
                case 'L':
                    result = 40;
                    move = 2;
                    break;
                case 'C':
                    result = 90;
                    move = 2;
                    break;
                default:
                    result = 10;
                    move = 1;
                    break;
            }
        }
        else
        {
            result = 10;
            move = 1;
        }
        return result;
    }

    private int PreC(int index, string s, ref int move)
    {
        //C 100
        //CD 400
        //CM 900
        int result = 0;
        int count = s.Length;
        if (index + 1 < count)
        {
            char c = s[index + 1];
            switch (c)
            {
                case 'D':
                    result = 400;
                    move = 2;
                    break;
                case 'M':
                    result = 900;
                    move = 2;
                    break;
                default:
                    result = 100;
                    move = 1;
                    break;
            }
        }
        else
        {
            result = 100;
            move = 1;
        }
        return result;
    }
}

第二种:利用字典的方法

思路:利用字典的方式

把字典当作一个存储容器,key 存储罗马字符的所有组合,value 存储该组合代表的值。

每次取一个字符,判断这个字符之后是否还有字符。如果有,则判断这两个字符是否在字典中,如果存在则取值。否则,按照一个字符去取值即可。

C# 语言

public class Solution
{
    public int RomanToInt(string s)
    {
        Dictionary<string, int> dic = new Dictionary<string, int>();
        dic.Add("I", 1);
        dic.Add("II", 2);
        dic.Add("IV", 4);
        dic.Add("IX", 9);
        dic.Add("X", 10);
        dic.Add("XL", 40);
        dic.Add("XC", 90);
        dic.Add("C", 100);
        dic.Add("CD", 400);
        dic.Add("CM", 900);
        dic.Add("V", 5);
        dic.Add("L", 50);
        dic.Add("D", 500);
        dic.Add("M", 1000);

        int result = 0;
        int count = s.Length;
        int i = 0;
        while (i < count)
        {
            char c = s[i];
            if (i + 1 < count && dic.ContainsKey(s.Substring(i, 2)))
            {
                result += dic[s.Substring(i, 2)];
                i += 2;
            }
            else
            {
                result += dic[c.ToString()];
                i += 1;
            }
        }
        return result;
    }
}

Python 语言

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        dic = {"I": 1, "II": 2, "IV": 4, "IX": 9,
               "X": 10, "XL": 40, "XC": 90,
               "C": 100, "CD": 400, "CM": 900,
               "V": 5, "L": 50, "D": 500, "M": 1000}
        result = 0
        count = len(s)
        i = 0
        while i < count:
            c = s[i]
            if i + 1 < count and s[i:i + 2] in dic:
                result += dic[s[i:i + 2]]
                i += 2
            else:
                result += dic[c]
                i += 1
        return result
Leetcode 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 阅读详情

相关推荐

Java实现整数互转罗马数字基本算法

这样,罗马数字就有下面七个基本符号:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000)。罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。表示两只手时,就画成“ⅤⅤ”形,后来又写成一只手向上、一只手向下的“Ⅹ”,这就是罗马数字的雏形。整数【788】用罗马数字表示:DCCLXXXVIII。整数【328】用罗马数字表示:CCCXXVIII。整数【238】用罗马数字表示:CCXXXVIII。整数【328】用罗马数字表示:CCCXXVIII。

猿小白的博客 1240

算法:罗马数字转整数

罗马数字包含以下七种字符: 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 的左边,所表示的数等于大

一枚不断学习的小码农一枚~ 1891

【简单】力扣算法题解析LeetCode13:罗马数字转整数

这篇文章介绍了一个将罗马数字转换为整数的算法。罗马数字由7种字符组成,每个字符对应特定数值。算法核心思想是遍历字符串,比较相邻字符的数值:若当前字符数值小于下一个字符数值,则减去当前值(处理特殊情况如IV=4);否则累加当前值。最后直接处理末尾字符的数值。通过switch语句高效获取字符对应的数值,时间复杂度O(n),空间复杂度O(1)。

ylumwd的博客 535

LeetCode题库 13罗马数字转整数(java)

罗马数字包含以下七种字符: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。 通常...

mcp3128 1186

避坑指南:RK3576+Android14适配移远5G模组(RG200U)时,我遇到的3个‘巨坑’及解决方案

本文详细记录了RK3576芯片适配Android14系统与移远RG200U 5G模组过程中遇到的三大技术难题:RIL服务启动失败、HIDL兼容性矩阵配置错误及ttyUSB权限冲突。通过实战案例提供了动态库拷贝、HIDL版本链声明和SELinux策略调整等解决方案,帮助开发者高效完成5G模组集成,特别适用于基于kernel6.1的嵌入式开发场景。

weixin_30664051的博客 389

2025使用VM虚拟机安装配置Macos苹果系统下Flutter开发环境保姆级教程--下篇

我们可以看到,目前配置基本完成了,现在有两个错,一个是Chrome没安装,这个自己安装就可以了,如果不需要WEB测试也不影响开发,另一个是Simulator还没安装,这个主要是安装的时间太长了,也就是上面的这一步。这里要注意,这个下载安装会比较慢,有的载会特别卡造成安装失败,最好的办法是挂一个VPN,保证安装完成,不过这个可以在以后单独进行安装。至此,基本的安装完毕,好多人会以为Xcode就OK了,其实还没有,我们还缺少命令行工具包,这个在安装完Flutter以后进行设置。

weixin_48803304的博客 1411

LeetCode简单题专栏:13.罗马数字转整数

该代码是一个简洁而有效的实现,用于将罗马数字字符串转换为整数。它利用了罗马数字的一个关键特性:在特定情况下,较小的数字可以表示减法。通过使用HashMap来存储罗马数字字符与其整数值之间的映射,以及通过比较相邻字符的值来处理加法和减法情况,代码能够准确地执行转换。此外,代码使用了Java的双层大括号初始化语法来简洁地初始化HashMap,这是一种在Java中初始化集合和映射的常用技巧。

m0_55977710的博客 1262

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

Leetcode简单系列13题:罗马数字转整数

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_44747847的博客 180

PostgreSQL14 离线安装全攻略:从下载到配置详解

本文详细介绍了PostgreSQL14在无网络环境下的离线安装全流程,涵盖RPM包与源码编译两种主流方法。文章重点解析了安装前的系统环境检查、依赖包准备、数据库初始化、远程访问配置以及安装后的关键检查与性能调优,旨在帮助运维和开发人员在离线服务器上高效、稳定地部署PostgreSQL14数据库。

p5l2m9n4o6q的博客 709

【图像超分】论文精读:SRConvNet: A Transformer-Style ConvNet for Lightweight Image Super-Resolution

本文提出了一种轻量级图像超分辨率重建方法SRConvNet,结合了卷积神经网络和Transformer的优势。针对传统Transformer计算复杂度高的问题,设计了傅立叶调制注意力(FMA)替代自注意力机制,通过区域频率空间调制实现高效的全局依赖建模;同时引入动态混合层(DML),采用混合尺度动态卷积结合通道拆分机制增强局部特征提取。实验表明,SRConvNet在计算效率和参数数量上显著优于现有轻量级超分方法,同时保持了优异的重建性能。该方法为移动端部署提供了有效的解决方案,在精度与复杂度间取得了良好平衡

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 806

【LeetCode】C++ :简单题 - 13 罗马数字转整数

13. 罗马数字转整数 难度简单1154 罗马数字包含以下七种字符: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 写做X...

weixin_44566432的博客 302

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

LeetCode:13. 罗马数字转整数——简单

题目: 13. 罗马数字转整数 罗马数字包含以下七种字符: 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, 即为 X

Vicky 155

Jetson AGX Orin和Drive AGX Orin相机的关联分析和编程指南

通过适当的相机接口和连接,以及使用适当的软件开发环境,开发人员可以在这些平台上实现相机功能。Jetson AGX Orin和Drive AGX Orin是NVIDIA推出的两款强大的计算平台,用于自动驾驶和人工智能应用。Jetson AGX Orin和Drive AGX Orin平台提供了强大的计算能力,使开发人员能够实现复杂的相机功能和算法。以上只是一些示例,Jetson AGX Orin和Drive AGX Orin平台提供了丰富的开发资源和工具,可用于实现各种复杂的相机应用。显示图像在一个窗口中。

CyberLynxO的博客 1119

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2326

Leetcode简单题:13.罗马数字转整数

Leetcode简单题目:罗马数字转整数

YuanRuizhao的博客 1736

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode13:罗马数字转整数 [简单]——switch或者map

题目描述: 罗马数字包含以下七种字符:I,V,X,L,C,D和M。 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大...

Vermouth_Su的博客 316

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【算法-罗马数字转整数(力扣-13)难度:简单】

例如, 罗马数字 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 可以放在

java-xiang 255

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

力扣#13 罗马数字转整数(难度:简单)

题目: 罗马数字包含以下七种字符:I,V,X,L,C,D和M。 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: ...

nlp87v5的博客 196

LeetCode:13. 罗马数字转整数————简单(C语言)

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。给定一个罗马数字,将其转换成整数。

Kinght_123的博客 364

⭐每天一道leetcode:13.罗马数字转整数(简单)

每天一道leetcode:13.罗马数字转整数(简单)

qq_63349644的博客 559

Leetcode13:罗马数字转整数 (简单题)python3

题目:罗马数字包含以下七种字符: 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 。 通

weixin_36679158的博客 155

LeetCode_Python3: 13. 罗马数字转整数(简单)

开始之前:从2018/8/27开始刷LeetCode,计划每周刷五题,周末进行总结并发布在csdn上,计划先刷150道题,从简单开始。 week 1-4 要求: 比较需要注意的一点在于,实际上只可能有一个小数出现在大数前而不会存在多个的情况。如IIV这种数字是不可能出现的,这就会方便很多了。 CODE: class Solution: def romanToInt(self...

Kuroyukineko的博客 456

leetcode-13.罗马数字转整数 - 难度:简单

题目:给定一个罗马数字,将其转换成整数。 做提前建议先查看leetcode官方给的罗马数字书写规则 题解: private static int romanToInt(String s){ int len = s.length(); int num = 0; for (int i = 0; i < len; i++) { char ch = s.charAt(i); if(ch == 'I'){ if(i+1 <.

漂浪的博客 259

leetcode 马数字转整数 最长回文子串

leetcode 简单|普通 简单 罗马数字转整数 题目 罗马数字包含以下七种字符: 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 写做

代登辉的博客 325
上一篇: Leetcode简单:9. 回文数
下一篇: Leetcode简单:14. 最长公共前缀
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程小助手_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值