学习启示:
1.首先这是一道操作题。初态和末态已知。所以要考虑 “模板的映射”。
2.基本功:熟练的双层循环操作+写初末终止条件
3.熟能生巧:auto关键字的应用,不断地自动赋值+(C++STL库的应用)
4.模板映射---》数据可以分为字母,数字,空格.....等。可以改变数据范围(限定字母用ACII来判断)倒置格式的不同设定。
5.”思路问题“---》有点递归的思想。如果没有分析出倒两次等于自己的事实(a与b异或两次等于b,,,有的时候思路是抽象的,也依赖于当时的灵感),就不会想到将单词封装成一个再倒置,就可能会通过逐个遍历字母的方式取取反,会很混乱。边界判断越多,越用容易写错。循环一次,就代表可能带来O(n)复杂度,所以要灵活考虑简化。
6.STL库本质上是数据结构,处理字符串和链表等问题,借鉴思想和分析方式,配合循环和写判断条件的基本功。另一边还要借助STL库的遍历,简化步骤。
即使边界多,一步步写,也不易出错
伪代码
1.输入输出格式,以头文件,完成变量初始化
2.整体逆置
3.单词逆置
检索每个单词,一个单词逆置一次,
每个单词逆置条件: 右边界(s.end)遇到空格
4.处理边界,字符串以/0结尾。标志着检索和逆置结束
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s;
getline(cin, s);
//翻转整个句子
reverse(s.begin(), s.end());
//翻转单词
auto start = s.begin();
while (start != s.end())
{
auto end = start;
while (start != s.end() && *end != ' ')
end++;
reverse(start, end);
if (end != s.end())
start = end + 1;
else
start = end;
}
cout<< s << endl;
return 0;
}
受限于知识,只是对当下的基础学习做一下总结,思路和知识上面尚且不足,如有错误欢迎指正!