LeetCode-13-罗马数字转整数

在这里插入图片描述

1、模拟

我们能想到的最简单的方法就是从第一位开始向后遍历,当遇到满足题目中提到的特殊情况时进行特殊处理,否则就继续加上相应的值。

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

2、模拟优化

我们可以从后向前进行遍历,并记录当前遇到过最大的数字。因为小数在右大数在左:1、因此当当前的数大于等于我们遇到过的最大值时,说明不是特殊情况,我们直接进行累加;2、当当前数字小于我们遇到的最大值时,说明这属于特殊情况,我们需要从当前值中减去这个较小值即可。最后为了方便我们的处理,我们可以使用哈希表进行查询进一步加快速度。

class Solution {
public:
    int romanToInt(string s) {
        int res = 0, temp_max = INT_MIN;
        unordered_map<char, int> hs{{'I', 1},
                                    {'V', 5},
                                    {'X', 10},
                                    {'L', 50},
                                    {'C', 100},
                                    {'D', 500},
                                    {'M', 1000}};
        for (int i = s.size() - 1; i >= 0; --i) {
            int value = hs[s[i]];
            if (value >= temp_max) {
                res += value;
                temp_max = value;
            } else
                res -= value;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值