leetCode刷题 13. 罗马数字转整数

目录

题目:

1. 思路

2. 解题方法

3. 复杂度

4. Code


题目:

罗马数字包含以下七种字符: I, V, X, LCD 和 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:

输入: 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 。

1. 思路

要将罗马数字转换为整数,可以通过遍历罗马数字字符串的每个字符,并根据规则逐个累加对应的数值。

2. 解题方法

  1. 初始化一个变量 result 用于存储转换后的整数值,初始值为 0。
  2. 遍历罗马数字字符串的每个字符:
    • 如果当前字符代表的数值比下一个字符代表的数值小,则将当前字符代表的数值加到 result 中,并将下一个字符代表的数值减去当前字符代表的数值,然后指针向后移动一位。
    • 否则,将当前字符代表的数值加到 result 中。
  3. 返回 result

3. 复杂度

  • 时间复杂度:O(n),其中 n 是罗马数字字符串的长度。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

4. Code

class Solution {public int romanToInt(String s) {int result = 0; // 用于存储转换后的整数值// 枚举罗马数字字符串的每个字符for (int i = 0; i < s.length(); i++) {char currentChar = s.charAt(i);int currentValue = getValue(currentChar); // 获取当前字符代表的数值// 如果当前字符代表的数值比下一个字符代表的数值小,则将下一个字符代表的数值减去当前字符代表的数值if (i < s.length() - 1 && currentValue < getValue(s.charAt(i + 1))) {result -= currentValue;} else {result += currentValue;}}return result;}// 获取字符对应的数值private int getValue(char c) {switch (c) {case 'I':return 1;case 'V':return 5;case 'X':return 10;case 'L':return 50;case 'C':return 100;case 'D':return 500;case 'M':return 1000;default:return 0;}}
}

        这段代码通过遍历罗马数字字符串的每个字符,并根据规则逐个累加对应的数值,实现了将罗马数字转换为整数的功能。

欢迎大家后台联系讨论。

(一份Java面试宝典,有兴趣的读者姥爷可以私信我领取!!!免费滴)

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

降低cpu占用率的方法

在 C 中&#xff0c;sleep(0) 并不会真正让线程休眠 0 秒。相反&#xff0c;它会暂停当前线程&#xff0c;使得其他线程有机会在当前线程之后执行。这在多线程环境中常用于实现一种简单的自旋锁。 当你调用 sleep(0) 时&#xff0c;它会让当前线程放弃 CPU 使用权&#xff0c;…

Vmware虚拟机使用过程中断电后无法重启处理

背景 今天在用新装的虚拟机进行测试的过程中&#xff0c;忽然笔记本关机了&#xff08;没插电源线&#xff09;&#xff0c;重启电脑后发现虚拟机提示“正在使用中“&#xff0c;具体如下所示&#xff1a; 解决 在相关虚拟机文件夹内查找以 .lck 结尾的文件&#xff0c;名称一…

Vue:封装响应式数据的防抖函数

代码&#xff1a; ts文件&#xff1a; import { customRef } from "vue"; export function useFangdou<T>(value: T, delay 200) {let timeout: number;return customRef((track, trigger) > {return {get() {track();return value;},set(newValue: T) {…

java中Volatile关键字的原理

Volitile的主要作用就是保持内存可见性和防止指令重排序。我分别说一下这两个作用的实现原理 1.保持内存可见性的实现原理 volatile内存可见性主要通过lock前缀指令实现的&#xff0c;它会锁定当前内存区域的缓存&#xff0c;并且立即将当前缓存的数据写入到主内存&#xff0…

记录dockers中Ubuntu安装python3.11

参考&#xff1a; docker-ubuntu 安装python3.8,pip3_dockerfile ubuntu22 python3.8-CSDN博客

解释“RNN encode-decode”

“RNN encode-decode” 涉及使用循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;来执行编码和解码操作。这种结构常用于处理序列数据&#xff0c;例如自然语言处理、语音识别和时间序列预测等任务。 以下是 “RNN encode-decode” 的一般概念&a…

西门子PLC常用底层逻辑块分享_单/双输出电磁阀

文章目录 前言一、功能概述二、单输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“单输出电磁阀”3.编写程序 三、双输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“双输出电磁阀”3.编写程序 前言 本文分享一个自己编写的电磁阀控制逻辑块。 一、功能概述 …

【代码随想录】【二叉树】补day21:二叉搜索树的最小绝对差 、二叉搜索树中的众数 、二叉树的最近公共祖先

最小绝对差 1.申请一个数组&#xff0c;比较两两之间最小的差值 def getresult3(self,node:TreeNode):self.nums[]self.getMinimumDifference(node)mindifferencefloat(inf)for i in range(len(self.nums)-1):mindself.nums[i1]-self.nums[i]if mindifference>mind:mindiff…

每日一面——C++11的新特性

写前声明&#xff1a;参考链接 C面经、面试宝典 等 ✊✊✊每日一面——C11的新特性 一、C11有哪些新特性&#xff1f;二、说一说了解的Lambda函数的全部知识三、C中的NULL和nullptr的区别&#xff1f;四、auto、decltype和 decltype(auto)的用法五、说说C中的智能指针和指针的区…

流程控制 JAVA语言基础

任何简单或复杂的算法都可以由三种基本结构组成&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构。 顺序结构 比较一般的结构&#xff0c;程序从上到下执行。 选择结构 我们从最简单的单路选择开始&#xff0c;符合条件的进入语句序列&#xff0c;不符合条件的…

virsh管理虚拟机的命令行工具

virsh是一个管理虚拟机的命令行工具&#xff0c;提供了丰富的命令来查看、创建、管理虚拟机。以下是一些常用的virsh命令&#xff1a; 查看帮助和版本&#xff1a; virsh --help&#xff1a;查看virsh命令的帮助信息。virsh -version&#xff1a;查看virsh的版本信息。 查看虚…

【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

[本节目标] map和set底层结构 AVL树 红黑树 红黑树模拟实现STL中的map和set 1.底层结构 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个 共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但…

提高分类或者预测模型的准确度

模型融合&#xff08;Ensemble&#xff09;&#xff1a;尝试将多个模型的预测结果进行融合&#xff0c;可以通过投票、加权平均等方式。这通常可以提高模型的鲁棒性和性能。 自适应学习率调整&#xff1a;使用自适应学习率调整方法&#xff0c;如AdamW中的自适应学习率&#x…

【PostgreSQL的变长字段数据超过多少会写入到TOSAST表】

通常PostgreSQL里如果一个元祖的变长字段的数据量&#xff0c;超过2KB&#xff0c;则PostgreSQL会尝试进行压缩&#xff0c;把元组控制在2KB之内&#xff0c;如果不能满足2KB之内的需求&#xff0c;就需要独立的toast表来存储了。 一、toast表相关的列存储参数 这个是否尝试压…

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中&#xff0c;缓存能抵挡大量数据库查询&#xff0c;减少数据库压力&#xff0c;对于缓存更新通常有以下几种模式可以选择&#xff1a; cache asideread/write throughwrite behind caching cache aside模式 Cache-aside模式是一种常用的用于管理缓存的模式。它…

RocketMQ学习笔记四(黑马)

课程地址&#xff1a; 1.Rocket第二章内容介绍_哔哩哔哩_bilibili &#xff08;视频35~88&#xff0c;搭建了一个电商项目&#xff09; 待学&#xff0c;待完善。

瑞_23种设计模式_策略模式

文章目录 1 策略模式&#xff08;Strategy Pattern&#xff09;★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;Comparator&#xff09; &#x1f64a…

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求&#xff0c;需要将线上表中老数据&#xff0c;修改为新数据的规则。 线上两张表&#xff0c;sequence_number中is_use有3作废、2到期状态&#xff0c;需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

温暖如初春:新生儿脸红小贴士

引言&#xff1a; 新生儿脸红是许多父母热切期待的瞬间之一。这种可爱的现象不仅令人陶醉&#xff0c;还可能是宝宝良好健康的标志。然而&#xff0c;在欣喜之余&#xff0c;父母也需要留意脸红背后的可能原因和注意事项&#xff0c;以确保宝宝的舒适和健康。 1. 探寻原因&…

通天星CMSV6 车载视频监控平台 信息泄露漏洞

漏洞描述 通天星CMSV6车载视频监控平台 StandardLoginAction getAlser.acion接口处存在信息泄露漏洞 fofa语句 body"/808gps/" 漏洞复现 打开页面 构造payload POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1 Host: User-Agent: Mozilla/5.0 (…