题目的主要信息:

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

总结题意,就是将输入字符串中的单词顺序翻转过来,

方法一:

首先遍历一遍字符串,如果当前字符不是空格,就把它加到temp中;如果当前字符是空格,把temp中的单词存到ans中。这样一遍遍历后,从原始的str中提取出单词,用ans存放这些单词,然后将ans翻转一遍,得到翻转的单词序列,再将这些单词用空格拼接起来,拼接的时候需要注意,最后一个单词后面不需要空格。 alt 具体做法:

class Solution {
public:
    string ReverseSentence(string str) {
        string temp = "";
        vector<string> ans;
        int len = str.size();
        for(int i=0;i<len;i++){//从原始的string中提取出单词
            if(str[i]!=' '){
                temp=temp+str[i];
            }else{
                ans.push_back(temp);//存入ans中
                temp.clear();
            }
        }
        ans.push_back(temp);
        reverse(ans.begin(), ans.end());//翻转单词序列
        string res;
        for(int i=0;i<ans.size()-1;i++){//保存结果
            res+=ans[i]+' ';
        }
        res+=ans[ans.size()-1];
        return res;
    }
};

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍字符串。
  • 空间复杂度:O(n)O(n),最坏情况下,有n个单词,ans大小为n。

方法二:

倒序遍历一遍字符串,如果当前字符不是空格,就把它存到temp中;如果当前字符是空格,就把temp中的单词以空格拼接到ans中,然后清空temp中的值,进行下一轮提取单词。最后遍历结束后,把最后一个单词加到ans中,返回ans中的值。

具体做法:

class Solution {
public:
    string ReverseSentence(string str) {
        string temp = "";
        string ans = "";
        int len = str.size();
        for(int i=len-1;i>=0;i--){//倒序遍历一遍字符串
            if(str[i]!=' '){//提取单词
                temp=str[i]+temp;
            }else{
                ans += temp + ' ';//拼接单词
                temp.clear();
            }
        }
        ans += temp;//最后一个单词加入
        return ans;
    }
};

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍字符串。
  • 空间复杂度:O(1)O(1),只用了常数空间。