1. 程式人生 > 實用技巧 >面試題58:翻轉字串

面試題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;
}