ZZULIOJ:1150: 数数多少个整数

题目描述

小明的老师给小明出了一道题目:数数一篇文章出现了多少个数字,请你帮帮他吧。

输入

输入一个字符串,由空格、英文字母、数字组成,以回车结束,长度小于1000。

输出

输出整数个数(不是数字字符个数哦)。

样例输入 Copy

365grh 27ha578

样例输出 Copy

3

提示

注意:010是两个数字,0和10

源代码

//刚开始的解题思路是按照类似于查单词的双指针方法来解题
//但是由于数字和数字之间隔的字符可能不止一个而且也无法确定是何种类型
//因此我们采用了递推处理、优化遍历的方式
//即直接遍历该字符串,在遍历之外设置空串
//如果遍历到的是数字则推进vector数组当中
//若不是则先判断是否此时的临时串为空,若非空则推入vector,重置临时串
//注意我们采用的这种方式在对于最后一个由临时空串组成的元素的时候是无法自动存入的
//因此当我们遍历到最后一个位置的时候,若临时串非空则有一个解,存入vector即可
//对于vector之内的元素我们还需要判断单独0的存在(因为我们推入的是一串串数字字符串,其中可能含有0)
//那么对于单独0我们可以发现一个规律,即0为最高位数字是为单独0,同时符合数学常识,即0不能为最高位
//遍历动态数组,每一个数字串必定有一个解,这个字符串之中含有n个单独0则增加n个解
//因此单独零我们又将其称为前缀0,使用while循环来清除,此处我们从头开始找前缀0
//在这里我们用数组来模拟数列,若头部有0且遍历的位置在最后一个位置之前的时候
//下标后移,存在一个前缀零,额外答案加一,相当于队列的出队操作
//那么继续向后遍历,此处不遍历至最后位置是为了特殊情况的出现
//对于前缀0我们三种情况
//第一种情况是03644,此时仅有一个前缀0,第二种情况是0000315,此时有多个前缀零
//第三种情况则是000000,由于我们计算答案的方式为数字串总数加上前缀零的个数
//也就是说在于循环当中每次遍历一个字串之后,必定进行ans += 1的操作
//于是我们在对于第三种情况多个前缀0进行删除并累加答案的同时删除至最后一位的前一位即可
//若没有idx < t.size() - 1,我们则会删完,对于000000的遍历答案也就会+6+1 = +7
//若是存在 idx < t.size() - 1,我们会保留最后一位0,答案也就会+5+1 = +6
//这也就证明了我们使用while来计算前缀0算法的可靠性与稳定性 
#include <iostream>
#include <vector>
using namespace std;
vector<string> A;
int main()
{
    string s;
    getline(cin,s);
    string t;
    for(int i = 0;i < s.size();i ++ )
    {
        if(s[i] >= '0' && s[i] <= '9')t = t + s[i];
        else
        {
            if(t != "")A.push_back(t);
            t = "";
        }
        if(i == s.size() - 1 && t != "")A.push_back(t);
    }
    int ans = 0;
    for(int i = 0;i < A.size();i ++ )
    {
        string t = A[i];
        int idx = 0;
        while(t[idx] == '0' && idx < t.size() - 1)
        {
            ans += 1;
            idx ++ ;
        }
        ans += 1;
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/126077231