你得先跨越恐惧才能获得你所想要的一切。

题目描述:

反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
string reverseWords(string s) {
string word = "";
string ans = "";
int tag = 0;
for(int i = 0;i < s.length();i++){
if(s[i] == ' '){
if(tag){
ans == "" ? ans = word : ans = word + " " + ans;
word = "";
tag = 0;
}else{
continue;
}

}else{
tag = 1;
word += s[i];
}
}
if(word != ""){
ans == "" ? ans = word : ans = word + " " + ans;
}
return ans;
}
};

image-20231022172336457

解读与收获:

用了一个笨但有效的方法:先设置一个标志位tag,从头遍历字符串,遇到空格且标志位为0时,则跳过空格继续遍历,遇到非空格则将标志位置1,并加到word中,这样当再次遇到空格时,标志位为1代表word中已经有了一个完整的单词,然后将word和ans结合,注意此处word要在ans前。这里有几个值得注意的地方,如果此时ans为空,则不能使用ans = word + “ “ + ans这种形式(会导致结尾多空格),必须区分出此情况。另外结束遍历时,word可能不为空(因为还没有来得及加入到ans,遍历就到结束条件了),此时应该用同样的方法将word与ans结合。