HJ92 在字符串中找出连续最长的数字串
题目来源 牛客网 HJ92
描述
输入一个字符串,返回其最长的数字子串,以及其长度。若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置)
本题含有多组样例输入。
数据范围:字符串长度 1 \le n \le 200 \1≤n≤200 , 保证每组输入都至少含有一个数字
输入描述:
输入一个字符串。1<=len(字符串)<=200
输出描述:
输出字符串中最长的数字字符串和它的长度,中间用逗号间隔。如果有相同长度的串,则要一块儿输出(中间不要输出空格)
1 2 3 4 5 6 7 8 9
| 输入: abcd12345ed125ss123058789 a8a72a6a5yy98y65ee1r2 输出: 123058789,9 729865,2 说明: 样例一最长的数字子串为123058789,长度为9 样例二最长的数字子串有72,98,65,长度都为2
|
题解代码
这道题的思路很简答,从前往后遍历一遍,遇到字符串就开始计算count
,并记录起始位置。最后再把起始位置和子串长度插入一个pair
里面。
需要注意的是,这里必须要用pair
,因为题目要求中提到了,如果有多个相同长度的数字串,就需要一并输出,并加上最后位的,长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include <stdio.h> #include <iostream> #include <vector> #include <string> using namespace std;
bool isNumStr(const char& c) { return (c >= '0' && c <= '9'); }
int main() { string s; while(getline(cin, s)) { vector<pair<int,int>> v; int begin = 0; int count = 0; int max = 0, mbegin; int flag = 0; for (int i = 0; i < s.size(); i++) { if (i < s.size() - 1 && isNumStr(s[i]) && isNumStr(s[i + 1])) { count++; if (flag != 1) { begin = i; flag = 1; } } else if (isNumStr(s[i])) { count++; } else { if (count >= max) { max = count; mbegin = begin; v.push_back(make_pair(count, begin)); } count = 0; flag = 0; }
}
if (count >= max) { max = count; mbegin = begin; v.push_back(make_pair(count, begin)); } for(auto e:v) { if(e.first==max) { for(int i = e.second;i<e.second+e.first;i++) { cout<<s[i]; } } } cout<<","<<max<<endl; }
return 0; }
|
做这道题的起因-另外一道题
咳咳,在学校上课的时候遇到了另外一道题目,这道题目只需输出一个最长数字子串就可以了,不需要关心长度相同的问题。
我的思路和HJ92一样,就是遍历找到数字子串的长度和起始位置,然后插入一个新的string再cout进行输出。其中s和ret_s
这两个变量都是string
然后我就遇到了“奇葩情况”
我还在本地测试了两次,发现“应该”
是不会多打印空格什么的
上图Linux G++,下图VS2019
而我通过了上面的HJ92
那道题,说明代码的思路是完全没有问题的,问题就出在输出这里
在结束之后(这道题限时,我没能解决这个问题)我才发现自己是个大笨蛋!
解决方法1:加斜杠0
注意,加endl
的方法我已经试过了,也不行
其实在这里,我是有想过加\0
的,但是我-加-错-位-置
了!!!应该给ret_S
加,哼哼啊啊啊啊
解决方法2:直接for打印
这个方法我也没想到,既然我都已经知道起始位置和子串长度了,为啥不直接打印原本string里面的内容呢?直接for打印一下不就行了???
只能说自己对容器的使用还不是很熟悉,知识没学到位啊,哭
把自己挂在这里告诫后来者