[剑指offer]翻转句子 ; 左旋字符串

/*
    42:> 翻转句子 ; 左旋字符串
    i am student -> student am i (整体翻转,局部翻转)
*/


void Reserve(char* pBegin, char* pEnd)
{
    if (pBegin == NULL || pEnd == NULL || pBegin+1==pEnd)
        return;
    while (pBegin < pEnd)
    {
        std::swap(*pBegin,*pEnd);
        pBegin++;
        pEnd--;
    }
}

void ReserveSentense(char* pData)
{
    if (pData == NULL)
        return;
    char* pBegin = pData;
    char* pEnd = pBegin;
    while (*pEnd != '\0')
        pEnd++;
    pEnd--;  //指向尾

    Reserve(pBegin, pEnd);//整体翻转

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

//void test()
//{
//  //char ar[] = "i am a student";
//  char ar[] = "                                i am a student";
//  ReserveSentense(ar);
//  cout << ar /*<< endl*/;
//}
/*
    左旋单词
    abcdefg ->2 -> cdefgab
    分两部分 ab cdefg 
    整体翻转 部分翻转
*/
void LeftRotateStr(char*pStr, int n)
{
    if (pStr == NULL || n<= 0)
        return;
    int len = strlen(pStr);
    n %= len;//大于长度会指向非法内存

    char* pFirstStart = pStr;
    char* pFirstEnd = pStr + n - 1;
    char* pSecondStart = pStr + n;
    char* pSecondEnd = pStr + len - 1;

    Reserve(pFirstStart, pFirstEnd);
    Reserve(pSecondStart, pSecondEnd);
    Reserve(pFirstStart, pSecondEnd);
}



//void test()
//{
//  char ar[] = "i am a student";
//  
//  LeftRotateStr(ar,15);
//  cout << ar << endl;
//}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值