js实现力扣第13题(罗马数字转整数)

原题链接:https://leetcode.cn/problems/roman-to-integer

1.解题思路

罗马数字转整数的核心逻辑是:

  1. 建立映射表:将罗马字符和对应的整数值一一对应,方便快速查询。
  2. 遍历判断规则:
    • 正常情况:小数字在大数字右侧,直接累加(如 VI = 5+1 = 6)。
    • 特殊情况:小数字在大数字左侧,用大数字减小数字(如 IV = 5-1 = 4)。
  1. 简化判断逻辑:遍历每个字符时,只需比较当前字符值和下一个字符值:
    • 如果当前值 < 下一个值 → 减去当前值(对应特殊情况)。
    • 如果当前值 ≥ 下一个值 → 加上当前值(对应正常情况)。
    • 最后一个字符直接累加(无下一个字符)。

2.代码实现

javascript 复制代码
/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
  const map = new Map()
  map.set('I',1)
  map.set('V',5)
  map.set('X',10)
  map.set('L',50)
  map.set('C',100)
  map.set('D',500)
  map.set('M',1000)
  let sum = 0 
  for(let i = 0;i<s.length;i++){
    if(map.get(s[i])<map.get(s[i+1])){
      sum -= map.get(s[i])
    }else {
      sum += map.get(s[i])
    }
  }
  return sum
};

3.解题过程拆解(以 MCMXCIV 为例)

我们以示例 5 的 MCMXCIV(对应 1994)为例,一步步拆解执行过程:

|----------|----------|----------------|-----------|-------------|-----------------|---------------|
| 索引 i | 当前字符 | currentVal | 下一个字符 | nextVal | 判断逻辑 | result 变化 |
| 0 | M | 1000 | C | 100 | 1000 ≥ 100 → + | 0+1000=1000 |
| 1 | C | 100 | M | 1000 | 100 < 1000 → - | 1000-100=900 |
| 2 | M | 1000 | X | 10 | 1000 ≥ 10 → + | 900+1000=1900 |
| 3 | X | 10 | C | 100 | 10 < 100 → - | 1900-10=1890 |
| 4 | C | 100 | I | 1 | 100 ≥ 1 → + | 1890+100=1990 |
| 5 | I | 1 | V | 5 | 1 < 5 → - | 1990-1=1989 |
| 6 | V | 5 | 无 | 0 | 5 ≥ 0 → + | 1989+5=1994 |

4.复杂度分析

  1. 时间复杂度:O(n)
    • n 是罗马数字字符串的长度,只需遍历字符串一次,每个字符的查询和计算都是 O (1) 操作。
    • 无论字符串多长,遍历次数和字符串长度成正比,因此时间复杂度为线性。
  1. 空间复杂度:O(1)
    • 映射表 map 存储的是固定的 7 组键值对,不随输入字符串长度变化。
    • 仅使用了常数级别的额外空间,因此空间复杂度为常数级。
相关推荐
weixin_307779136 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
2601_9499506311 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao173383712 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
福兮说12 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
Zootopia62612 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan13 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_9603563814 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
凤城老人14 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)14 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
h_a_o777oah14 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分