LeetCode 13:罗马数字转整数

思路:
1.以string字符串为基础,一个个识别字符,然后转成对应的数字。
2.正常情况下是
ans=s[0] (需要转成数字)
左边>右边,只需要一个个累加就可以,ans=ans+右边
左边=右边, ans=ans+右边
特殊情况下,
左边<右边, 结果ans=ans+右边-2左边 (上一次已经加过左边)
(此处我的思路是对第二个数判断处理,也可以对第一个数进行处理,那样就不用-2
左边,而是ans=ans-左边)
左边>右边,只需要一个个累加就可以,ans=ans+左边
左边=右边, ans=ans+左边
特殊情况下,ans=ans-左边
3.为了方便进行判断左右关系,同时读取两个数,但是如果出现特殊情况,左边在上一步已经加过了,所以需要减去2个左边
4.如果给定的字符串s是一定正确表示的罗马数字,那么按规则n位数最多出现n次特殊情况,而且左边和右边的数一定是规则里限定的,
不会出现99=IC 错误表达
不会出现900+400=CMCD 错误表达
5. string的单个元素是char,以单引号‘ ’,字符串才是双引号“ ”

方法一:字符串判断,累和

class Solution {
public:
    int changeRoma(char a)
    {
        if(a=='I')
            return 1;
        else if(a=='V')
            return 5;
        else if(a=='X')
            return 10;
        else if(a=='L')
            return 50;
        else if(a=='C')
            return 100;
        else if(a=='D')
            return 500;
        else if(a=='M')
            return 1000;
        else
            return 0;

        return 0;
    }

    int romanToInt(string s) {

        int len=s.size();
        int i=0;
        int r=0;
        int l=0;
        int ans=changeRoma(s[0]);
        
        while(i<len-1)
        {
            l=changeRoma(s[i]);
            r=changeRoma(s[i+1]);
            if(l<r)
                {  ans=ans-l+r-l;   }
            else
                {  ans=ans+r;       }
            i++;
        }
        return ans;
    }

};

在这里插入图片描述
提升:

  1. 使用哈希表匹配值
    unordered_map<string, int> m = {{“I”, 1}, {“IX”, 8}, {“V”, 5}, {“X”, 10}, {“L”, 50}, {“C”, 100}, {“D”, 500}, {“M”, 1000}};

  2. 条件运算符 ?
    a=Exp1 ? Exp2 : Exp3;
    exp1为真,则a=exp2,否则a=exp3

看完其他人的代码,感觉都是差不多思路的,没有必要去把 IV=3 (实际是4)这种变相扭曲可读性来实现代码精简。

思路都差不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值