题解
wangbinfeng · · 题解
大家好,感谢大家阅读这篇题解!
思路:
首先,我们看到题,也许直觉认为是统计数字个数(数字是指 ,出题人语文水平有待提高)。
but abc123abc2a3a1 只有三个数字,但答案是
统计数的个数大家都会吧,具体在注释里。
我看过其他的题解,大多都用 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;
}
最后,谢谢大家支持!
更新日志:
- 4月27日:感谢 @cd8gsh 提醒,原因:数字有可能在最后,加入特判。
- 8月20日:感谢 @ZhuangnnnnE 提醒,原因:由于处理上一个 hack 触发了潜在 bug(即 0 这个特殊的数,它会与代表 目前没有存数字 的 0 重复),已修正。
- 我没想到红题 hack 这么多,想大家谢罪,也感谢 2 位发现 hack 的同学!