题目
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
string reverseWords(string s) {
}
分析
参数:字符串string s(单词之间肯呢个有多个空格)
返回:处理后的字符串string
处理:将字符串中的单词顺序颠倒,且 单词 之间用单个空格连接
思路:
字符串可能包含多余的前导空格和尾随空格,需要先处理掉,再将字符串按空格分割成多个单词。
考虑到多个空格之间也可能有单词,所以使用一个字符串和一个字符串数组配合来分割单词,最终得到一个字符串数组。
一旦我们得到了单词的列表,我们可以简单地反转该列表。
最后,我们将这些单词重新拼接成一个字符串,每个单词之间使用一个空格连接。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
string reverseWords(string s) {
//去除多余的前导空格
int start=0;
int end=s.size()-1;
while(start<= end&&s[start]==' '){
start++;
}
//去除多余的尾随空格
if(start<=end&&s[end]==' '){
end--;
}
//分割单词
//创建words用于存储单词
vector<string>words;
string word;
//遍历字符串
for(int i=start;i<=end;i++){
//扫到的字符非空格,则加入word
if(s[i]!=' '){
word+=s[i];
}else if (!word.empty()) {
//扫到的字符非空格,将当前word加入words,并清空
words.push_back(word);
word.clear();
}
}
//将最后一个单词加入words
// 处理最后一个单词
if (!word.empty()) {
words.push_back(word);
}
//将words中的单词进行翻转。
reverse(words.begin(),words.end());
//拼接单词并返回
string result;
for(int i=0;i<words.size();i++){
result+=words[i];
if(i!=words.size()-1){
result+=" ";//单词之间加上空格
}
}
return result;
}
注意:在编写代码的过程中,一开始我忽略了加入!word.empty()的必要性。
如果字符串 s 中有多个连续的空格,word 会被添加一个空字符串到 words 向量中,从而导致多余的空字符串进入最终结果。
因此我们在对字符串 word 进行操作(比如将其存入 words 向量中)之前,应检查该字符串是否为空。
接下来我们来介绍一下上述代码涉及到的知识点:
1.C++ 中常见的字符串操作函数:
1)word.empty() 检查字符串是否为空。
2)word.clear() 通过 clear(),我们可以清空一个字符串的内容,通常用于重用一个字符串或准备好一个新的值。
2.vector的用法:
1) words.push_back(word) 将元素添加到 vector 容器的末尾。
3.reverse 是 C++ 标准库中的算法函数,用于反转容器中的元素。通过 <algorithm> 来引入。
语法是: reverse( first, last);
first:指向容器第一个元素的迭代器。
last:指向容器最后一个元素的后一个位置的迭代器。
通过 reverse,可以方便地将容器中的元素顺序反转。
在我们的字符串问题中,我们使用它来反转存储单词的 vector,从而改变单词的顺序。
测试
int main() {
string s = " the sky is blue ";
cout << "Reversed string: '" << reverseWords(s) << "'" << endl;
return 0;
}