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

    xiaoxiao2024-12-01  61

    上篇博客我们讲到 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; }
    最新回复(0)