剑指offer——翻转单词顺序VS左旋转字符串

字符串的交换等,注意判断字符串的是否为NULL,以及判断边界等。

#include <iostream>
#include <string>
using namespace std;

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

char* ReverseSentence(char* pData)
{
    if (pData==NULL)
    {
        return NULL;
    }
    char *pBegin=pData;
    char *pEnd=pData;
    while(*pEnd!='\0')
    {
        pEnd++;
    }
    pEnd--;
    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;
}

char* LeftRotateString(char *pStr,int n)
{
    if (pStr==NULL)
    {
        return NULL;
    }
    int nLength=static_cast<int>(strlen(pStr));
    if (nLength>0&&n>0&&n<nLength)
    {
        char* pFirstStart=pStr;
        char* pFirstEnd=pStr+n-1;
        char* pSecondStart=pStr+n;
        char* pSecondEnd=pStr+nLength-1;
        Reverse(pFirstStart,pFirstEnd);
        Reverse(pSecondStart,pSecondEnd);
        Reverse(pFirstStart,pSecondEnd);
    }
    return pStr;
}

int main()
{
    char str[]="hello world";
    cout<<ReverseSentence(str)<<endl;
    cout<<LeftRotateString(str,3)<<endl;
    return 0;
}
posted @ 2014-09-06 21:48  啵啵那个臭  阅读(193)  评论(0编辑  收藏  举报