【牛客网】字符串中找出连续最长的数字串

【牛客网】字符串中找出连续最长的数字串

本题链接
题目描述
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述:

个测试输入包含1个测试用例,一个字符串str,长度不超过255。

输出描述:

在一行内输出str中里连续最长的数字串。

示例1
输入

abcd12345ed125ss123456789

输出

123456789

【解题思路】
此题是一道比较典型的找子串问题,题意不难,但是易错。我们需要先用一个字符串保存输入字符串中数字串,在用一个字符串保存数字串中最长的串
代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str;//输入字符串
    string cur;//保存数字串
    string ret;//保存最长数字串
    cin>>str;
    for(int i = 0;i<=str.size();i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            cur+=str[i];
        }
        else{
            if(ret.size()<cur.size())
            {
                ret = cur;
            }
            else{
                cur.clear();//清空cur,放入新的字符串
            }
        }
    }
    cout<<ret<<endl;
    return 0;
}

易错点:
此题虽然简单,但是很容易错,且错的一脸懵逼(说的就是我,哈哈)
1.for(int i = 0;i<=str.size();i++)这个等号是不是很碍眼,代码写习惯了,我们进行遍历时,是不加等号的。但并不是所有的循环都如此,比如此题。
在这里插入图片描述
在这里插入图片描述
当末尾是长数字串时,代码出现问题,为什么?经过调试我才发现,循环最后一次进去,遍历的是字符串的最后一个字符,cur返回的是123456789但循环经过if直接跳出了,这个值并没有给到ret,所以返回错误。加等号的原因就在这,循环再进入一次,将cur附给ret,则返回正确。
2.
在这里插入图片描述
将最长数字串给ret时,这样判断是正确的,但是ret.size()<=cur.size()还对吗?不对,因为我这样写就错了,哈哈哈。
错误截图:
在这里插入图片描述
原因:比如这个测试用例abcd12345ed125ss123456789循环第一次进入,ret附成12345,但在经过字符时,正确做法,是清空cur,若加上“=”则无法进入到函数cur.clear()中导致一直无法置空,将所有的数字都赋给了ret,产生错误。

发布了29 篇原创文章 · 获赞 66 · 访问量 5870

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/104998372