翻转单词顺序列

剑指OFFER题43------按牛客网热度排序

时间:2019.1.14.1926
作者:Waitt

题目

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

时间限制:1秒 空间限制:32768K 热度指数:238752

思路

解法1:

将整个字符串整体反转,再单独反转每个单词:

反转前:I am a student.
整体反转:.tneduts a ma I
逐个反转单词student. a am I

这种方法看似麻烦,但也是比较简单的方法,书中的解法。

class Solution {
public:
    void Reve(string &str,int i,int j)//自己创建合适的反转函数
    {
        while(i<j)
        {
            char t=str[i];
            str[i]=str[j];
            str[j]=t;
            i++;
            j--;
        }
    }
    string ReverseSentence(string str) {
        string a;
        if(str.empty())
            return a;
        int n=str.size();
        int i=0,j=n-1;//i指向头,j指向尾
        Reve(str,i,j);//进行整体反转
        i=0;
        j=0;
        while(i<n)//进行遍历,单独反转每个单词;i指向单词头,j指向单词尾
        {
            if(str[j]!=' ')//j不是空格,则+1
                j++;
            if(str[j]==' '||j==n)//当遇到空格,或到字符串末位
            {
                Reve(str,i,j-1);//单独反转每个单词
                i=j+1;
                j++;
            }
        }
        a=str;
        return a;
    }
};

需要注意的是:反转单词进行判断时,不仅要判断空格,还要注意是否到字符串尾部

思路2

这种思路自己所想,看似简单,但中间要调用大量字符串函数,还需要额外建立栈,而且对空格计数以及单词计数把控严格。实现起来比上一种方法更为复杂。空间复杂度与时间复杂度也更复杂

将每个单词顺序存在一个栈中,每个单词后的空格加到单词前,再依次出栈,组成新的字符串。
例如:“I am a student.”,以下用0代替空格

栈:
student.栈顶
0a
0am
0I栈底

class Solution {
public:
    string ReverseSentence(string str) {
        string a;
        if(str.empty())
            return a;
        int i=0,n=str.size();//i表示每次单词的起始位置
        stack<string> b;
        int j=0,k=0;//j为每个单词的字母和字符数量,k为紧接着单词的空格数目
        while(i<n)
        {
            if(str[i+j+k]!=' ')//每次表示位置必须用i+j+k
                j++;//j为每个单词的字母和字符数量
            if(str[i+j+k]==' '||i+j+k>=n)
            {
                while(str[i+j+k]==' ')
                //此处必须是内部循环,若使用if+continue,则会进入下一循环,导致错误
                {
                    a=a+" ";//单词后的空格加到单词前
                    k++;//k为紧接着单词的空格数目
                }
                a=a+str.substr(i,j);//截取当前单词
                i=i+j+k;
                j=0;
                k=0;
                b.push(a);
                a.clear();
            }
        }
        while(b.size())
        {
            a=a+b.top();
            b.pop();
        }
        return a;
    }
};

注:每次代码一定要带入一个正常的案例逐步进行分析,静下心来慢慢分析,才可发现bug或问题所在。

你可能感兴趣的:(翻转单词顺序列)