上篇博客我们讲到 2017年校招真题之删除公共字符 的三种解法,今天我们来看一看校招真题中的倒置字符串的解法
2017年校招真题——倒置字符串
题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1
输入: I like beijing.
输出: beijing. like I
解题思路
-
解法一
思路是先通过substr将字符串分割成一个一个的单词放入vector中,再将vector中的单词逆序输出,即可完成倒置字符串
-
解法二
思路是先用字符串逆置函数reverse将字符串整体逆置,再遍历该字符串,找出每个单词,进行局部逆转,即可完成倒置字符串 -
解法三
这就是一个比较巧妙的解法了,比较难理解,但是代码确实很简单,我们重点讲解一下这种解法,直接利用cin>>str接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了
代码实现
- 解法一
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string str;
vector<string> v;
getline(cin,str);
size_t pos = 0,start = 0;
do{
pos = str.find(' ',start);
string ret = str.substr(start,pos - start);
v.push_back(ret);
start = pos + 1;
}while(pos < str.size());
vector<string>::reverse_iterator it = v.rbegin();
while(it != v.rend())
{
cout << *it <<" ";
++it;
}
cout << endl;
return 0;
}
- 解法二
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
// 注意这里要使用getline,cin>>s遇到空格就接收结束了
getline(cin, s);
// 翻转整个句子
reverse(s.begin(), s.end()); // 翻转单词
auto start = s.begin();
while (start != s.end())
{
auto end = start;
while (end != s.end() && *end != ' ')
end++;
reverse(start, end);
if (end != s.end())
start = end + 1;
else
start = end;
}
cout << s << endl;
return 0;
}
- 解法三
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
string ret = "";
while (cin >> str)
{
ret = (" " + str) + ret;
}
ret.erase(ret.begin());
cout << ret << endl;
return 0;
}