C++ 工程师养成 每日一题4.5 (迭代器遍历)

首先说明,当每日一题标号不是整数时代表此题是较为简单的,我在这里整理一遍主要是我做错了(没错是我太菜各位大佬无视就好)

题目:

读入一个字符串str,输出字符串str中的连续最长的数字串

 

 

此题思路清晰下面给出我自己的解法:

我第一次做的正确答案时使用迭代器进行遍历完成的

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 void FFind(string s){
 5     auto it = s.begin();
 6     string a,res;
 7     while (it != s.end()){
 8         if (*it >= 48 && *it <= 57){
 9             a =a + *it;
10         }
11         else{
12             if (a.size() > res.size()){
13                 res = a;
14                 a.clear();
15             }
16             else{
17                 a.clear();
18             }
19         }
20         it++;
21     }
22     if (a.size() > res.size()){         //因为取不到end()位置会引发程序崩溃,所以使用迭代器的话在遍历最后一个位置的时候就必须在循环外在此判断一次条件,不美观且降低了程序可读性
23         res = a;
24     }
25     cout << res;
26 }
27 int main(){
28     string s;
29     getline(cin, s);
30     FFind(s);
31     return 0;
32 }

在写完之后我果断去找了其他大佬写的程序,才发现我这个人老把问题想得太麻烦!!

老是忘记string也可以使用[ ] 来取内容,这样遍历就不会造成无法判断最后一次循环(最后一个位置的下一个位置)

大佬答案如下:

 1 #include<iostream>
 2 using namespace std;
 3 #include<string>
 4 int main()
 5 {
 6     string s, res, cur;
 7     cin >> s;
 8     for (int i = 0; i <= s.length(); i++)
 9     {
10                                                        
11         if (s[i] >= '0' && s[i] <= '9')                 //使用 [ ] 符来取内容 
12         {
13             cur += s[i];                                
14         }
15         else
16         {
17                                                            // 找出更长的字符串,则更新字符串
18             if (res.size() < cur.size())
19                 res = cur;
20             else
21                 cur.clear();
22         }
23     }
24     cout << res;
25     return 0;
26 }

菠菜~贱卖,菠菜!贱卖!!菠菜!!贱卖!!!菠 ‘ 菜 ’  !!!!

posted @ 2019-11-11 00:07  Kaniso_Vok  阅读(159)  评论(0编辑  收藏  举报