leetcode13. 罗马数字转整数,流程图带你遍历所有情况

leetcode13. 罗马数字转整数

在这里插入图片描述
示例 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 。

在这里插入图片描述

题目描述

给定一个罗马数字字符串,将其转换为整数。

算法分析

这个问题可以通过遍历罗马数字字符串并解析每个字符来解决。罗马数字由特定的字符表示,每个字符都有其对应的整数值。在解析时,我们需要考虑一些特殊情况,比如某些字符组合(如IV, IX, XL, XC, CD, CM)表示的整数值与单个字符的组合不同。

算法步骤

  1. 初始化一个变量 res 用于存储结果,并将其设置为 0。
  2. 遍历罗马数字字符串 s
  3. 对于每个字符,根据其值和其后的字符,更新 res
  4. 考虑特殊情况,如IV, IX等,并正确处理。
  5. 返回最终结果 res

算法流程

字符为I
下一个字符为V
下一个字符为X
其他情况
字符为X
下一个字符为L
下一个字符为C
其他情况
字符为C
下一个字符为D
下一个字符为M
其他情况
字符为V
字符为L
字符为D
字符为M
还有更多字符
没有更多字符
开始
读取字符串s的第一个字符
检查下一个字符
结果加4
跳过下一个字符
结果加9
跳过下一个字符
结果加1
检查下一个字符
结果加40
跳过下一个字符
结果加90
跳过下一个字符
结果加10
检查下一个字符
结果加400
跳过下一个字符
结果加900
跳过下一个字符
结果加100
结果加5
结果加50
结果加500
结果加1000
读取下一个字符
结束

具体代码

class Solution {
public:
    int romanToInt(string s) {
    int n=s.size();
    int res=0;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='I')
        {
            if(s[i+1]=='V')
            {
                res+=4;
                i++;
            }
            else if(s[i+1]=='X')
            {
                res+=9;
                i++;
            }
            else
            {
                res+=1;
            }
        }
        else if(s[i]=='X')
        {
            if(s[i+1]=='L')
            {
                res+=40;
                i++;
            }
            else if(s[i+1]=='C')
            {
                res+=90;
                i++;
            }
            else
            {
                res+=10;
            }
        }
        else if(s[i]=='C')
        {
            if(s[i+1]=='D')
            {
                res+=400;
                i++;
            }
            else if(s[i+1]=='M')
            {
                res+=900;
                i++;
            }
            else
            {
                res+=100;
            }
        }
        else 
        {
            if(s[i]=='V')
            {
                res+=5;
            }
            else if(s[i]=='L')
            {
                res+=50;
            }
            else if(s[i]=='D')
            {
                res+=500;
            }
            else if(s[i]=='M')
            {
                res+=1000;
            }
        }
    }
    return res;
    }
};

算法分析

复杂度分析

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

易错点

  • 在处理特殊情况时,确保正确地识别和处理它们。
  • 在更新结果时,确保正确地计算整数值。

注意事项

  • 确保在遍历字符串时不要超出字符串的边界。
  • 在处理字符串元素时,确保不会转换错误。

相似题目

题目链接
罗马数字转整数https://leetcode.com/problems/roman-to-integer/
整数转罗马数字https://leetcode.com/problems/integer-to-roman/
反转字符串https://leetcode.com/problems/reverse-string/
字符串转换整数https://leetcode.com/problems/string-to-integer-atoi/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cider瞳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值