【牛客网】—— 倒置字符串

上篇博客我们讲到 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;
}
发布了167 篇原创文章 · 获赞 175 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chenxiyuehh/article/details/90573806