面试题58:翻转字符串

1 题目描述

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

2 输入

string str

3 输出

string str

4 样例输入

“I am a student.”

5 样例输出

“student. a am I”

6 求解思路

  两次翻转字符串,第一次翻转整个串,第二次翻转子串。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include "MyUtils.h"
using namespace std;

void Reverse(string &str, int begin, int end){
    if(str.length() < 1 || begin == end)
        return ;

    while(begin < end){
        char temp = str[end];
        str[end] = str[begin];
        str[begin] = temp;
        begin++;
        end--;
    }
}

string ReverseSentence(string str){
    int length = str.length();
    if(length < 1)
        return str;
    int begin = 0;
    int end = length - 1;
    // 先翻转整个串
    Reverse(str, begin, end);
    // 再分别翻转里面的串
    begin = 0;
    end = 0;
    while(begin < length){
        if(str[end] == ' ' || end == length){
            Reverse(str, begin, end - 1);
            end++;
            begin = end;
        }
        else
            end++;
    }
    return str;
}

int main()
{
    string str = "I am a student.";
    cout<<ReverseSentence(str);
    return 0;
}

原文地址:https://www.cnblogs.com/flyingrun/p/13556644.html