LeetCode刷题:13.罗马数字转整数+对字符串的理解

前言

  • 文章作为日记或心得,记录学习过程
  • 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
  • 如对内容有任何建议或看法,欢迎评论区学习交流

正文

题目

在这里插入图片描述

解答

六种特殊情况,对于每种表示,其只会出现一次。用所有对应的小写字母代表他们出现的次数,均初始化为0
m记录M出现的次数,若有CM,则cm=1,则其值为m_=m*1000-cm*100
d记录D出现的次数,若有CD,则cd=1,则其值为d_=d*500-cd*100
c记录C出现的次数,若有XC,则xc=1,则其值为c_=(c-cm-cd)*100-xc*10
l记录L出现的次数,若有XL,则xl=1,则其值为l_=l*50-xl*10
x记录X出现的次数,若有IX,则ix=1,则其值为x_=(x-xc-xl)*10-ix
v记录V出现的次数,若有IV,则iv=1,则其值为v_=v*5-iv
i记录I出现的次数,其值为i_=(i-ix-iv).
最后的结果即为m_+d_+c_+l_+x_+v_+i_
按照上述思路执行以下代码

class Solution 
{
public:
    int romanToInt(string s) 
    {
        int m = 0, d = 0, c = 0, l = 0, x = 0, v = 0, i = 0;
        int cm = 0, cd = 0, xc = 0, xl = 0, ix = 0, iv = 0;
        int m_ = 0, d_ = 0, c_ = 0, l_ = 0, x_ = 0, v_ = 0, i_ = 0;
        for (size_t j = 0; j < s.length(); j++)
        {
            if (s[j] == 'M')
                m++;
            if (s[j] == 'D')
                d++;
            if (s[j] == 'C')
                c++;
            if (s[j] == 'L')
                l++;
            if (s[j] == 'X')
                x++;
            if (s[j] == 'V')
                v++;
            if (s[j] == 'I')
                i++;
        }
        int cm_ = s.find("CM");
        if (cm_ != s.npos)
            cm = 1;
        int cd_ = s.find("CD");
        if (cd_ != s.npos)
            cd = 1;
        int xc_ = s.find("XC");
        if (xc_ != s.npos)
            xc = 1;
        int xl_ = s.find("XL");
        if (xl_ != s.npos)
            xl = 1;
        int ix_ = s.find("IX");
        if (ix_ != s.npos)
            ix = 1;
        int iv_ = s.find("IV");
        if (iv_ != s.npos)
            iv = 1;
        m_ = m * 1000 - cm * 100;
        d_ = d * 500 - cd * 100;
        c_ = (c - cm - cd) * 100 - xc * 10;
        l_ = l * 50 - xl * 10;
        x_ = (x - xc - xl) * 10 - ix;
        v_ = v * 5 - iv;
        i_ = (i - ix - iv);
        return m_ + d_ + c_ + l_ + x_ + v_ + i_;
    }
};

一次通过

结果

在这里插入图片描述

问题

仍然是string的相关操作不熟练

string.find()

在寻找子字符串的过程中,最后选取的.find()函数是可以完成的,函数参数为子字符串,返回的是首次出现的位置,若不存在,则返回一个特别的标记.npos王陸给了更详细的解释。

strstr()

在用.find()之前,还尝试了strstr的方法

	string s = "123";
	char* f = strstr(s, "12");
	int l = strlen(s);

报错如下
在这里插入图片描述

尝试以下代码,没报错。突然好像明白哪错了

	char s[] = "123";
	char* f = strstr(s, "12");
	int l = strlen(s);

区别

char和string的函数不一样,在查找子串时的函数存在区别。
对于string就是.find();对于char就是strstr()。参考

    string s = "123";
    int f = s.find("12");//直接返回位置
    if (f != s.npos)//未找到时的判断
        //后续操作
	char s[] = "123";
	char *f = strstr(s, "12");//返回的是子串的地址
	if(f != NULL)//未找到时的判断
		int location = f - s;//这才可以知道位置

看来还是基础没有掌握好。
后来发现

    string s = "123";
    int f = s.find("12");//直接返回位置
    if (f != -1)//也可以,如果没找到,其返回值就是-1.以后就用-1判断吧,好理解一点。
        //后续操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值