面试题58

题目地址:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/

题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

题目示例

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

解题思路

普通法:分析题目可得,分三个步骤处理字符串s;

  • Step1:去除掉字符串s的首尾空格;
  • Step2:从后向前遍历字符串s,并使用变量word_len统计每个单词字符数,如果遇到空字符并且word_len不为0,此时,检测到一个单词,向字符串res后面追加该单词以及空字符;
  • Step3:处理字符串首部,即从字符串尾部遍历至首部i=0时,此时,不再需要追加空字符。

栈存储:观察题目示例,我们发现可以根据栈的特点“后进先出”,利用栈来解决问题。

  • Step1:去除掉字符串s的首尾空格;
  • Step2:定义栈word来存储字符串s中的所有单词,使用变量str存放当前单词;
  • Step3:遍历字符串s中的字符s[i],当该字符不是空字符时,将该字符加入到当前单词str中。否则,如果当前字符为空字符,且当前单词str大小不为0时,表示当前单词已完成拼接,则将该单词入栈,并重置存储临时单词变量str;
  • Step4:遍历结束之后,判断当前单词str大小是否为0,如果不等于0,表示最后一个单词要存入栈中,此时,将最后一个单词入栈,到此,所有的单词均已成功入栈;
  • Step5:当栈不为空时,对栈进行循环遍历,每次取出一个单词res,则追加一个空字符;
  • Step6:将字符串res中最后多余的一个空字符去掉。

程序源码

普通法

class Solution {
public:
    string reverseWords(string s) {
        if(s.size() < 1) return s;
        s.erase(0, s.find_first_not_of(' '));
        s.erase(s.find_last_not_of(' ') + 1);

        string res;
        int word_len = 0;
        for(int i = s.length() - 1; i >= 0; i--)
        {
            if(s[i] !=' ')
            {
                word_len++;
            }
            else if(s[i] == ' ' && word_len != 0)
            {
                res += s.substr(i+1, word_len) + " ";
                word_len = 0;
            }
            if(i == 0 && word_len != 0)
            {
                res += s.substr(i, word_len);
            }
        }
          return res;
    }
};

栈存储

class Solution {
public:
    string reverseWords(string s) {
        if(s.size() < 1) return s;
        s.erase(0, s.find_first_not_of(' '));
        s.erase(s.find_last_not_of(' ') + 1);
        stack<string> word;
        string res, str;
        for(int i = 0 ; i < s.size(); i++)
        {
            if(s[i] != ' ')
            {
                str += s[i];
            }
            else
            {
                if(str.size() != 0)
                {
                    word.push(str);
                }
                str.clear(); //重置str用于存放新单词
            }
        }
        if(str.size() != 0) //将字符串s的最后一个单词入栈
        {
            word.push(str);
        }
        while(!word.empty())
        {
            res += word.top() + " ";
            word.pop();
        }
        res = res.substr(0,res.size() - 1); //去掉res中最后一个空字符,获得字符串s中从第0位开始的长度为res.size-1的字符串,即[0,res.size()-1)
        return res;
       }
};
----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
原文地址:https://www.cnblogs.com/wzw0625/p/12596947.html