当前位置: 首页 > news >正文

每日算法练习:LeetCode 13. 罗马数字转整数 ✅

大家好,我是你们的算法小伙伴。今天我们来练习一道字符串处理的经典题目 ——LeetCode 13. 罗马数字转整数。这道题考察对特殊规则的处理,是面试中常见的基础题。


题目描述

罗马数字包含以下七种字符:IVXLCDM,分别对应数值:

表格

字符数值
I1
V5
X10
L50
C100
D500
M1000

通常情况下,罗马数字中小的数字在大的数字的右边。但存在特例,例如:

  • IV= 4,IX= 9
  • XL= 40,XC= 90
  • CD= 400,CM= 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. 建立一个字符→数值的映射表(HashMapswitch)。
  2. 遍历字符串:
    • 如果当前字符数值 < 下一个字符数值 → 减去当前数值(处理特例)。
    • 否则 → 加上当前数值。
  3. 最后一个字符没有下一个字符,直接加上它的数值。

代码实现

import java.util.HashMap; import java.util.Map; class Solution { public int romanToInt(String s) { // 建立罗马字符到数值的映射 Map<Character, Integer> map = new HashMap<>(); map.put('I', 1); map.put('V', 5); map.put('X', 10); map.put('L', 50); map.put('C', 100); map.put('D', 500); map.put('M', 1000); int res = 0; int n = s.length(); for (int i = 0; i < n - 1; i++) { int current = map.get(s.charAt(i)); int next = map.get(s.charAt(i + 1)); // 处理特例:当前值 < 下一个值,减去当前值 if (current < next) { res -= current; } else { res += current; } } // 加上最后一个字符的数值 res += map.get(s.charAt(n - 1)); return res; } }

代码详解(示例 5 模拟)

示例 5:s = "MCMXCIV"→ 对应字符:M C M X C I V

表格

i当前字符当前值下一个字符下一个值操作res
0M1000C1001000 ≥ 100 → +10001000
1C100M1000100 < 1000 → -100900
2M1000X101000 ≥ 10 → +10001900
3X10C10010 < 100 → -101890
4C100I1100 ≥ 1 → +1001990
5I1V51 < 5 → -11989
-V5--+51994

最终结果1994,与示例一致。


复杂度分析

  • 时间复杂度:O (n),遍历字符串一次。
  • 空间复杂度:O (1),映射表大小固定为 7,仅使用常数级额外空间。

总结

  1. 核心技巧:利用 “小数在大数左边则减法” 的规则,一次遍历完成转换。
  2. 代码简洁:通过哈希表快速查找字符对应数值,逻辑清晰易读。
  3. 边界处理:最后一个字符单独处理,避免数组越界。

这道题是字符串处理和规则判断的经典入门题,非常适合练习基础算法思维。

今天的每日算法练习就到这里,我们明天再见!👋

http://www.jsqmd.com/news/537751/

相关文章:

  • SQL核心操作笔记:索引创建与数据查询全解析(附实例)
  • Llama-3.2V-11B-cot部署教程:双卡4090一键启动视觉推理工具
  • C++的std--ranges资源清理
  • 京东智能抢购解决方案:告别手慢无的自动化下单工具
  • 2026年提干辅导培训机构推荐:部队考生碎片化时间利用与薄弱科目强化辅导服务分析 - 十大品牌推荐
  • 毕业论文神器 9个一键生成论文工具:全行业通用测评+高效写作推荐
  • Go gRPC 流式通信实现与优化
  • Linux静态库与共享库开发实践指南
  • 别再用time.time()测速了!(金融计算性能评估黄金标准:Wall-clock + CPU-cycle + L3-cache-miss三维校准法)
  • Gemma-3-12b-it多模态交互效果展示:复杂图表分析与跨模态推理实例
  • ChatGLM3-6B-128K多语言支持:跨语言翻译实践
  • MelonLoader:Unity游戏插件加载的终极解决方案
  • 零代码自动化:用OpenClaw+ollama-QwQ-32B搭建个人RSS资讯聚合器
  • 项目代码从0到1上传到Git的完整步骤,涵盖单项目和多项目两种场景
  • 计算机毕业设计:基于Python的美食数据采集可视化系统 Django框架 Scrapy爬虫 可视化 数据分析 大数据 机器学习 食物 食品(建议收藏)✅
  • C++线程异步和wpf中比较
  • 阿里大模型二面真题:RAG系统评估指标详解(非常详细),从入门到精通,收藏这一篇就够了!
  • vLLM-v0.17.1部署教程:vLLM + Telegraf+InfluxDB指标采集体系搭建
  • 揭秘大数据领域分布式计算的高效实现策略
  • 用 Codex 接管当前 Chrome 调试会话:Chrome DevTools MCP 实战指南
  • Python服务OOM频发却查无实据?(2024最新内存检测工具矩阵深度评测:准确率/开销/兼容性三维打分)
  • MusePublic商业应用实战:快消品牌季度视觉内容AI辅助生产流程
  • 零样本学习进阶:RexUniNLU小样本微调技巧
  • 仓颉STS-beta先锋招募进行中 | Cangjie 1.1.0-beta.24 已发布,快来一起捉虫吧~
  • SDMatte开源模型贡献指南:如何提交PR改进透明物体识别模块
  • 2026年阿通移动头式裁断机/裁断机/液压裁断机/摇臂裁断机厂家推荐哪家好 - 行业平台推荐
  • 银行回单识别技术:融合计算机视觉与自然语言处理,实现对多版式回单的高精度解析
  • 基于Android手机的语音数据采集系统(语音数据自动上传至电脑端)
  • 2026年建议收藏|顶流之选的AI论文平台——千笔ai写作
  • Qwen3-32B-Chat镜像性能实测:OpenClaw长任务稳定性优化方案