牛牛爱字符串
牛牛爱字符串
https://ac.nowcoder.com/acm/contest/6885/A
题目描述
牛牛在玩字符串。
牛牛得到了一个字符串(可能含有空格),他希望在这些字符串中提取出数字。
例如:a1b23c456d007890中可以提取出1, 23, 456, 7890共4个数字。
现在,他得到了一个长度高达1000的字符串,请你帮他提取出所有的数字。
输入描述:
本题有多组数据。
输入一个字符串S。
输出描述:
输出提取出的所有数字,相邻两个数字用一个空格隔开。
不包含数字的时候输出空行
注意,你输出的数不能含有前导0。
题目分析
- 首先,这是一道考察字符串的题目,刚开始拿到题目的时候感觉到了一丝熟悉的感觉,我便快速的敲敲敲,一交,测试样例也过了,但是结果却是wa,wa,wa!!!
后面得到大佬的提点我才发现是自己忽略了大数的存在,大数的存在已经让我错过了好多好多,所以这个题目不能去计算数有多大,而是要把数字当成字符输出,并且要注意很多细节,比如:字符串含有空格,两个数字之间要有空格,并且数字不能还有前导零,这些种种细节让我一直在思考...不过好在最后做出来了。方法一
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 10; char c[maxn]; int main() { string s; int ans = 0, flag, cnt; while (gets(c)) { s = ""; ans = 0, flag = 0, cnt = 0; int lc = strlen(c); for (int i = 0; i < lc; ++i) { if (isdigit(c[i])) { s += c[i]; //c++特殊加法 if (c[i] == '0' && flag) //如果当前字符是零,且没有输出过不是零的数字字符,那么就可以判断这是一个前导零,是不需要输出来的 //如果当前字符是零,但有过输出不是零的数字字符那么说明他不是前导零1,可以输出 printf("%c", c[i]); if (c[i] != '0') //不是零直接输出并且标记一下输出了 printf("%c", c[i]), flag = 1; } if (isdigit(c[i]) && !isdigit(c[i + 1])) //如果下一个字符不是数字字符那么要输出空格了 { int ls = s.length(); //记录长度,判断当前字符串是不是都是零,特殊情况特殊处理 cnt = 0; for (int j = 0; j < ls; ++j) if (s[j] == '0') ++cnt; if (cnt == ls && cnt)//如果都是零,并且有字符那么直接输出一个0 printf("0"), flag = 1;//有输出就标记一下,因为要判断什么时候输出空格 if (flag) printf(" "), flag = 0; s = ""; cnt = 0; } } puts(""); } }
牛客比赛系列题解 文章被收录于专栏
加油加油