Skip to content

Latest commit

 

History

History
83 lines (66 loc) · 2.18 KB

44.翻转单词顺序.md

File metadata and controls

83 lines (66 loc) · 2.18 KB

44.翻转单词顺序

题目描述

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

 

解题思路

下面的思路来自《剑指offer》。

  • 首先对句子中的每个单词进行翻转(以空格为界,标点也算在挨着的单词里面),然后对整个字符串进行翻转。或者先整个字符串翻转,再单词翻转。

 

代码

  • 先翻转单词,再翻转整个句子

实现一,手动翻转

class Solution {
private:
    void reverseWord(string &str, int begin, int end){
        while(begin<end){
            swap(str[begin], str[end]);
            begin++;
            end--;
        }
    }
public:
    string ReverseSentence(string str) {
        int length = str.length();
        int begin=0, end=0;
        // 翻转每个单词
        while(begin<length){
            if(str[begin] == ' '){
                begin++;
                end++;
            }else{
                while(str[end]!=' ' && end<length) end++;
                reverseWord(str, begin, end-1);
                begin = ++end;
            }
        }
        // 翻转整个字符串
        reverseWord(str, 0, length-1);
        return str;
    }
};

实现二,std::reverse函数翻转

class Solution {
public:
    string ReverseSentence(string str) {
        int length = str.length();
        int begin=0, end=0;
        // 翻转每个单词
        while(begin<length){
            if(str[begin] == ' '){
                begin++;
                end++;
            }else{
                while(str[end]!=' ' && end<length) end++;
                reverse(str.begin()+begin, str.begin()+end);
                begin = ++end;
            }
        }
        // 翻转整个字符串
        reverse(str.begin(), str.end());
        return str;
    }
};