13.罗马数字转整数(LeetCode)

原题链接

13.罗马数字转整数

初思路

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

在这里插入图片描述
菜狗的一些快乐。

优化思路

这个代码的缺点就是它太冗长了,不够简洁【确信】
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
在这里插入图片描述
而且我们其实可以把这个利用map的特性实现一一对应

class Solution {
private:
    unordered_map<char, int> symbolValues = {
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };

public:
    int romanToInt(string s) {
        int ans = 0;
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            int value = symbolValues[s[i]];
            if (i < n - 1 && value < symbolValues[s[i + 1]]) {
                ans -= value;
            } else {
                ans += value;
            }
        }
        return ans;
    }
};

时间复杂度O(n),n是字符串的长度
空间复杂度O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Grausam

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

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

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

打赏作者

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

抵扣说明:

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

余额充值