剑指offer-翻转字符串和左旋转字符串

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
 
/*
Q1:
    翻转单词的顺序:
        输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序保持不变。
        为简单起见,标点符号和普通字符一样处理。
S1:
    1. 这里通过两次进行翻转,首先把整个句子翻转然后得到全部字符都翻转的结果;
       再对第一次翻转的结果做每个单词的翻转,间隔以单词之间的空格符作为分割。

Q2:
    左旋转字符串:
        输入一个字符串,把字符串前面的若干个字符转移到字符串的末尾。
        例如
            输入:abcdefgh 2
            输出:cdefghab
S2:
    1. 通过第一个问题我们可以知道,对于字符abcdefgh,我们可以先把字符划分为
       ab和cdefgh两部分,然后分别进行翻转,得到bahgfedc,然后对这个字符进行
       选择得到:cdefghab,即为所求。
*/

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

void reverseString(char*pBegin, char*pEnd)
{
    if(pBegin == nullptr || pEnd == nullptr)
        return;
    
    while(pBegin < pEnd)
    {
        char tmp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = tmp;

        pBegin++;
        pEnd--;
    }
}

char*reverStr(char*pData)
{
    if(pData == nullptr)
        return nullptr;
    
    char*pBegin = pData;
    char*pEnd = pData;
    while(*pEnd != '\0')
        pEnd++;
    pEnd--;

    // std::cout << *pBegin << " " << *pEnd << std::endl;

    reverseString(pBegin, pEnd);

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

char*leftRotateStr(char*pData, int n)
{
    if(pData == nullptr)
        return nullptr;
    
    int length = static_cast<int>(strlen(pData));
    if(length > 0 && n > 0 && (n < length))
    {
        char*p_1 = pData;
        char*p_2 = pData + n - 1;
        char*p_3 = pData + n;
        char*p_4 = pData + length -1;

        reverseString(p_1, p_2);
        reverseString(p_3, p_4);
        reverseString(p_1, p_4);
    }
    return pData;
}

void test_1()
{
    std::cout << "Test 1" << std::endl;
    char pData[] = "I am a student.";
    std::cout << pData << std::endl;
    char*rst = reverStr(pData);
    std::cout << rst << std::endl;

    char data_2[] = "abcdefgh";
    std::cout << data_2 << std::endl;
    char*rst_2 = leftRotateStr(data_2, 2);
    std::cout << rst_2 << std::endl;
}

void test_2()
{
    std::cout << "Test 2" << std::endl;
    char pData[] = "I";
    std::cout << pData << std::endl;
    char*rst = reverStr(pData);
    std::cout << rst << std::endl;

    char data_2[] = "abcdefgh";
    std::cout << data_2 << std::endl;
    char*rst_2 = leftRotateStr(data_2, 1);
    std::cout << rst_2 << std::endl;
}

void test_3()
{
    std::cout << "Test 3" << std::endl;
    char pData[] = " ";
    std::cout << "1" << pData << "1" << std::endl;
    char*rst = reverStr(pData);
    std::cout << rst << std::endl;

    char data_2[] = "";
    std::cout << data_2 << std::endl;
    char*rst_2 = leftRotateStr(data_2, 2);
    std::cout << rst_2 << std::endl;
}

void test_4()
{
    std::cout << "Test 4" << std::endl;
    char pData[] = "";
    std::cout << pData << std::endl;
    char*rst = reverStr(pData);
    std::cout << rst << std::endl;

    char data_2[] = " ";
    std::cout << data_2 << std::endl;
    char*rst_2 = leftRotateStr(data_2, 2);
    std::cout << rst_2 << std::endl;
}

void test_5()
{
    std::cout << "Test 5" << std::endl;
    char*pData = nullptr;
    std::cout << pData << std::endl;
    char*rst = reverStr(pData);
    std::cout << rst << std::endl;

    char*data_2 = nullptr;;
    std::cout << data_2 << std::endl;
    char*rst_2 = leftRotateStr(data_2, 2);
    std::cout << rst_2 << std::endl;
}

void test_reverseStr()
{
    test_1();
    test_2();
    test_3();
    test_4();
    test_5();
}

int main(int argc, char**argv)
{

    test_reverseStr();

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值