(剑指Offer)面试题42:翻转单词顺序

题目:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。

例如输入字符串“I am a student.”,则输出"student. a am I".

思路:

这是一道常见的面试题,思路分两步:

1、翻转句子中的所有字符;

2、翻转句子中每一个单词;

代码:

#include <iostream>
#include <string.h>

using namespace std;

void Reverse(char* pBegin,char* pEnd){
    if(pBegin==NULL || pEnd==NULL)
        return;
    char tmp;
    while(pBegin<pEnd){
        tmp=*pBegin;
        *pBegin=*pEnd;
        *pEnd=tmp;
        pBegin++;
        pEnd--;
    }
}

char* ReverseSentence(char* pData){
    if(pData==NULL)
        return NULL;

    char* pBegin=pData;
    /*
    char* pEnd=pData;
    while(*pEnd!='\0')
        pEnd++;
    pEnd--;
    */
    int len=strlen(pData);
    char* pEnd=pData+len-1;

    Reverse(pBegin,pEnd);

    pBegin=pEnd=pData;
    while(*pBegin!='\0'){
        if(*pBegin==' '){
            pBegin++;
            pEnd++;
        }
        else if(*pEnd==' ' || *pEnd=='\0'){
            Reverse(pBegin,--pEnd);
            pBegin=++pEnd;
        }
        else{
            pEnd++;
        }
    }

    return pData;
}


int main()
{
    char data[]="Hello world!";
    cout << ReverseSentence(data) << endl;
    return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/3194a4f4cf814f63919d0790578d51f3?rp=2

AC代码:

class Solution {
public:
    string ReverseSentence(string str) {
        int len=str.length();
        if(len<=1)
            return str;
        int pBegin=0;
        int pEnd=len-1;

        Reverse(str,pBegin,pEnd);

        pBegin=0;
        pEnd=0;
        while(pBegin<=len-1){
            if(str[pBegin]==' '){
                pBegin++;
                pEnd++;
            }
            else if(str[pEnd]==' ' || pEnd==len){
                Reverse(str,pBegin,pEnd-1);
                pBegin=++pEnd;
            }
            else
                pEnd++;
        }

        return str;
    }

    void Reverse(string &str,int pBegin,int pEnd){
        char tmp;
        while(pBegin<pEnd){
            tmp=str[pBegin];
            str[pBegin]=str[pEnd];
            str[pEnd]=tmp;
            pBegin++;
            pEnd--;
        }
    }
};
posted @ 2015-07-28 15:55  AndyJee  阅读(358)  评论(0编辑  收藏  举报