小白刷leetcode系列之罗马数字转换成整数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这篇文章是该系列的第一篇,主要讲一下小白刷leetcode的一些心路历程


题目:罗马数字转换成整数

因为之前刷过数组类的题目,想刷下字符串的今天就刷下字符串吧,小白就要从最简单的开始

刷题过程

1.打开题目

首先打开字符串系列题目
在这里插入图片描述
我们阅读一下题目
在这里插入图片描述
可以看出是将罗马数字转换成整数,还是挺简单的
刷题有个窍门就是先看下标签和提示
在这里插入图片描述
这里有相关标签提示是用到哈希表
不过我感觉这里用不到哈希表
在这里插入图片描述
还有个提示告诉我们从尾到头遍历字符串和使用一个map,map其实就是映射的意思

2.解题过程

映射我理解的就是将罗马数字和对应的整数连接起来,这使我想到了c语言的switch,可以通过case将罗马数字与整数连接起来,就避免了复杂的if语句

 switch(s[i])
        {
            case 'I': l=1;break;
            case 'V': l=5;break;
            case 'X': l=10;break;
            case 'L': l=50;break;
            case 'C': l=100;break;
            case 'D': l=500;break;
            case 'M': l=1000;break;     
        }
        if(l>=k)
        {
            sum+=l;
            k=l;
        }
        else{
            sum-=l;
            k=l;
        }

我们观察罗马数字,从右边开始看,从右边开始数当第一个数字比第二个数字大时则需减去第二个数字,否则加起来,这里我们找到了转化的规律
下面是完整代码

int romanToInt(char * s){
   
    int k=0;
    int sum=0;
    for(int i=strlen(s)-1;i>=0;i--)
    {
        int l=0;
        switch(s[i])
        {
            case 'I': l=1;break;
            case 'V': l=5;break;
            case 'X': l=10;break;
            case 'L': l=50;break;
            case 'C': l=100;break;
            case 'D': l=500;break;
            case 'M': l=1000;break;     
        }
        if(l>=k)
        {
            sum+=l;
            k=l;
        }
        else{
            sum-=l;
            k=l;
        }
    }
    return sum;
}

其实博主一开始是选择sizeof函数来计算字符串长度,应该是比较少刷题导致的

在这里插入图片描述
sizeof函数计算字符串长度的原理是把字符串每个字节的长度加起来,这就包括了字符串结尾的’\0’,结尾标识符所以在进行for循环时就会数组溢出,导致程序崩溃,第二次我就用了strlen函数


总结

其实,这道题目还是相当简单的一道题,就当做笔记啦
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值