剑指offer:翻转单词顺序列

题目描述

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

思路:

微软实习面试一面算法题,简单描述就是翻转字符串,但保证其中单词顺序不变。

采用的方法是,先将字符串整个翻转,再将其中单词一一翻转一遍,即可实现目标。识别单词是空格起始和空格结束。这里翻转字符串的函数与左旋转字符串中使用的一样。

思路很直接,但是有一些要注意的细节。还有“”表示空字符串,“”不等于NULL,“”会创建一个对象,占内存空间,NULL不占内存空间。‘ ’表示空格,必须是单引号,里面必须打一个空格。因为引号表示字符,双引号表示字符串。

参考代码:

在线测试

https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3?tpId=13&tqId=11197&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=3

AC代码

class Solution {
public:
    string ReverseSentence(string str) {
        if(str.size()<=0)
            return "";
        reverse(str, 0, str.size()-1);
        for (int i=0;i<str.size();i++)
        {
            if(str[i]!=' ')//碰到非空格表示开始单词了
            {
                int begin=i;//记录下单词起始位置
                i++;
                while(i<str.size()&&str[i]!=' ')//注意这里必须要确保i<str.size(),因为上一步增加了i;直到碰到空格,说明单词结束了
                {
                    i++;
                }
                reverse(str,begin,i-1);//单词的结束位置是i-1,第i位是空格,肯定不满足上面的if条件,所以直接i++判断下一个位置
            }
        }
        return str;
    }
    void reverse(string &str, int begin, int end)
    {
        if(begin>=end)
            return;
        int i=begin;
        int j=end;
        while(i<j)
        {
            swap(str[i],str[j]);
            i++;
            j--;
        }
    }

};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81877970