LeetCode 0013. Roman to Integer

本文介绍了一种将罗马数字转换为整数的简洁算法。通过遍历字符串,比较当前字符与前一字符的大小,实现高效转换。避免了复杂的情况判断,提供了一种易于理解和实现的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题简析

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

初步思路

分为三部分计算:C放在D,M左右的部分;X放在L,C左右的部分,I放在V,X左右的部分。
1)C放在D,M左右的部分:如果在D,M出现前,C出现了,则C是-100,否则C是100.
2)X放在L, C左右的部分:如果在L,C出现前,X出现了,则X是-10,否则是10.
3)I放在V, X左右的部分:如果在V,X出现前,I出现了,则I是-1,否则是1.

这种思路分几种情况考虑和读取,太繁琐,脑子都搞晕了。显然不是一个easy难度题该有的解法。

更简洁的思路

不需要分多种情况讨论,可以总结为:从左到右读取字符串,如果当前位置字符对应的值小于等于前一个位置字符对应的值,最终值就加上上一个位置字符对应值,否则就减去上一个位置字符对应值。

题解

class Solution {
public:
    int romanToInt(string s) {
        map<char, int> valueMap{ {'I',1}, {'V',5}, {'X',10}, {'L',50}, 
                                    {'C',100}, {'D',500}, {'M',1000} };
        int result = 0;

        for (int i = 1; i < s.size(); i++) {
            if (valueMap[s[i]] <= valueMap[s[i - 1]]) {
                result += valueMap[s[i - 1]];
            }
            else {
                result -= valueMap[s[i - 1]];
            }
        }
        result += valueMap[s[s.size()-1]];

        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值