C++ 工程师养成 每日一题fourth (reverse的使用)

题目:

将一句话的单词进行倒置,标点不倒置。

 

 这道题最简单的解法是使用algorithm提供的reverse()函数

具体步骤我写在代码注释里面:

 1 #include <string>
 2 #include <algorithm>
 3 int main(){
 4     string s;
 5     getline(cin, s);      //输入的字符串中包含空格,所以不能使用cin输入(遇到空格会停止),使用getline读取全部的字符(遇到换行符、EOF、自定义符号停止)
 6     auto it = s.begin();  //本体我选择用迭代器进行遍历字符串
 7     reverse(s.begin(), s.end());    //第一步先将整个字符串逆置,之后再分别将每一个单词逆置
 8     while (it!=s.end()){
 9         auto ii = it;
10         while (ii != s.end() && *ii != ' '){    //找到一个单词的结束位置
11             ii++;
12         }
13         reverse(it, ii);                    //逆置当前单词
14         if (ii != s.end()){          
15             it = ii + 1;               //重新定义下一个单词的开头位置,+1是因为单词之间只有一个‘ ’
16             ii++;
17         }
18         else{                         //若当前是最后一个位置,则直接给予结束条件结束循环
19             it = s.end();
20         }
21     }
22     cout << s;        //输出结果
23     return 0;
24 }

此次最主要的点就是熟悉reverse()的使用

但是单单就这一道题来说还有更优解法,也是我在写完之后才发现其他大佬写的,这里分享出来给大家:

 1 #include<iostream>
 2 using namespace std;
 3 #include<string>
 4 int main()
 5 {
 6     string s1;
 7     string s2;
 8 
 9     cin >> s1;
10 
11     while (cin >> s2&&getchar() != '\n')
12     {
13         s1 = s2 + " " + s1;
14     }
15 
16     cout << s2 << " " << s1 << endl;
17     return 0;
18 }

看完表示我确实是菜。。。。

posted @ 2019-11-10 23:49  Kaniso_Vok  阅读(179)  评论(0编辑  收藏  举报