题解 | #字符串中找出连续最长的数字串#

字符串中找出连续最长的数字串

https://www.nowcoder.com/practice/bd891093881d4ddf9e56e7cc8416562d

字符串中找出连续最长的数字串

#include <iostream>
#include <string>
using namespace std;

bool IsContinuousDigit(string& str, int begin, int end){
    for(begin; begin < end; ++begin){
        if(!isdigit(str[begin]))
            return false;
    }
    return true;
}
bool IsContinuousAlpha(string& str, int begin, int end){
    for(begin; begin < end; ++begin){
        if(!isalpha(str[begin]))
            return false;
    }
    return true;
}

int main()
{
    string str;
    cin >> str;
    auto it = str.begin();
    int maxCount = 0, count = 0;
    while(it != str.end()){
        count = 0; // 重置count
        if(isalpha(*it)){ // 字母
            while(it != str.end() && isalpha(*it)){ // 一直是字母
                ++it;
                ++count;
            }
            maxCount = max(maxCount, count);
        }
        else{
            while(it != str.end() && isdigit(*it)){ // 一直是数字
                ++it;
                ++count;
            }
            maxCount = max(maxCount, count);
        }
    }
    string ret;
    // 寻找maxCount个数据的子串
    for(size_t i = 0; i < str.size(); i++){
        if(IsContinuousDigit(str, i, i+maxCount) || IsContinuousDigit(str, i, i+maxCount))
            ret += str.substr(i, maxCount);
    }
    cout << ret << endl;
}

由于我一开始看错题目了,把字符串看成数字串。因此多了很多多余操作。

如果只是数字串的话。可以考虑用一个额外的空间tmp来存储全是数字的串,然后当走到不是数字时,与ret比较哪个大,tmp大就把tmp的内容赋值给ret,如果ret大,就清空tmp
继续遍历。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str, tmp, ret;
    cin >> str;
    for(size_t i = 0; i < str.size(); ++i)
    {
        if(str[i] >= '0' && str[i] <= '9'){
            tmp += str[i];
        }
        else{ // 非数字时比较size大小
            if(tmp.size() > ret.size())
                ret = tmp;
            else
                tmp.clear();
        }
    }
    // i走到\0的时候,也有可能最后的数字串是最大的,
    // 但此时因为已经跳出for循环了,因此需要再比较一次
    if(tmp.size() > ret.size())
        ret = tmp;
    else
        tmp.clear();
    cout << ret << endl;
    return 0;
}
全部评论

相关推荐

昨天 18:54
门头沟学院 Java
点赞 评论 收藏
分享
11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务