题解

· · 题解

大家好,感谢大家阅读这篇题解!

思路:

首先,我们看到题,也许直觉认为是统计数字个数(数字是指 9\ge x \ge 0 的数 ,出题人语文水平有待提高)。

but abc123abc2a3a1 只有三个数字,但答案是 4 ,可以得出应该求得是

统计数的个数大家都会吧,具体在注释里。

我看过其他的题解,大多都用 C++ 中的 string ,所以本题解使用读入一个字符判断一次。

然后还有几个易错点,大家可以看更新日志(数据有点水,所以容易忽略细节,大家一定注意)。

程序:

//由于处理了2个hack且间隔时间较长,代码刻意加入了很多内容,可能使可读性变差,求谅解
#include <bits/stdc++.h>
using namespace std;
bool num[1000];//存储是否出现过
bool flag;//存有没有出现过0
char c,c2;//由于没有用字符串,只能多开一个变量存上一个字符
int ans,x;
int main(){
    for(c=getchar();c!=EOF;c=getchar()){
        if(c2=='0'&&(c<'0'||c>'9')&&x==0)flag=true;
        if(c>='0'&&c<='9')x=x*10+c-'0';//计算现在是多少
        else num[x]=true,x=0;//记录并归零
        c2=c;//记录上一个字符
    }
    if(c2>='0'&&c2<='9'&&num[x]==false)ans++;//注意要有特判
    if(c2=='0')ans++;
    for(int i=1;i<1000;i++)ans+=num[i];
    cout<<ans+flag;
}

最后,谢谢大家支持!

更新日志:

  1. 4月27日:感谢 @cd8gsh 提醒,原因:数字有可能在最后,加入特判。
  2. 8月20日:感谢 @ZhuangnnnnE 提醒,原因:由于处理上一个 hack 触发了潜在 bug(即 0 这个特殊的数,它会与代表 目前没有存数字 的 0 重复),已修正。
    • 我没想到红题 hack 这么多,想大家谢罪,也感谢 2 位发现 hack 的同学!