一、题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

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

二、题目难度:简单

三、题解

方法一:分割+反转

java实现
class Solution {
    public String reverseWords(String s) {
        String[] strs = s.split(" +");//使用正则的方式解决多空格问题
        StringBuilder sb = new StringBuilder();
        for(int i=strs.length - 1;i>=0;i--){
            sb.append(strs[i]).append(" "); 
        }
        return sb.toString().trim();
    }
}

 

 

class Solution {
    public String reverseWords(String s) {
        String[] strs = s.split(" ");
        StringBuilder sb = new StringBuilder();
        for(int i=strs.length - 1;i>=0;i--){
            if(!"".equals(strs[i]))
                sb.append(strs[i]).append(" ");  
        }
        return sb.toString().trim();
    }
}

 

 方法二:双指针法

通过每个单词的首尾位置来提取单词

class Solution {
public:
    string reverseWords(string s) {
        int n = s.length();
        int i = n - 1;
        int j = i;
        string res = "";
        while(i>=0){
            while(i>=0&&s[i]!=' ')
                i--;
            res += s.substr(i+1,j-i)+" ";
            while(i>=0&&s[i]==' ')
                i--;
            j = i;
        }
        res.erase(0,res.find_first_not_of(" "));//去掉头空格
        res.erase(res.find_last_not_of(" ") + 1);//去掉尾空格
        return res;
    }
};

 

 

 C++去掉头尾空格的方法:

if(!res.empty()){
    res.erase(0,res.find_first_not_of(" "));//去掉头空格
    res.erase(res.find_last_not_of(" ") + 1);//去掉尾空格
}

 方法三:双指针法反转字符

分为三步:

1.去除多余的空格:包括首尾和中间,使用原地移除空格元素的方法

2.将整个字符串反转

3.将每个单词反转

时间复杂度:O(n)

空间复杂度:O(1)

class Solution {
public:
    string reverseWords(string s) {
        
        //去除多余空格
        removeExtraSpaces(s);
        reverse(s.begin(),s.end());//全部字符串反转
        int n = s.length();
        int i = 0,j = 0;
        while(j<n){
            while(j<n&&s[j]!=' ') j++;
            reverse(s.begin()+i,s.begin()+j);//每个单词反转
            while(j<n&&s[j]==' ') j++;
            i = j;
        }
        return s;
    }
    void removeExtraSpaces(string &s){
        int n = s.length();
        int i = 0;
        int j = 0;
        while(j<n&&s[j] == ' ') j++;//去除头部空格
        while(j<n){//去掉字符串中间的多余空格
            if(j - 1>0 && s[j] == s[j-1] && s[j] == ' ') j++;
            else s[i++] = s[j++];
        }
        if (i - 1 > 0 && s[i - 1] == ' ') // 去掉字符串末尾的空格
            s.resize(i - 1);
        else 
            s.resize(i); // 重新设置字符串大小
    }
};

 

posted on 2021-02-28 19:50  曹婷婷  阅读(86)  评论(0编辑  收藏  举报