翻转单词顺序 VS 左旋转字符串43

题目一(翻转单词顺序):输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student.”则输出”student. a am I”。

解题思路:

  1. 首先翻转整个字符串
  2. 再翻转句子中的每个单词

测试用例:

int main(){
    //输入字符串
    char str[16] = "I am a student.";
    //翻转单词顺序
    char *res = ReverseSentence(str);
    //输出结果
    if(res != NULL)
        std::cout << res << std::endl;  //Output: student. a am I

    return 0;
}

函数实现:

//题目一:翻转单词顺序
//关键函数-翻转字符串中的一段
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递增到空字符时,前后都需要递增
            pBegin++;
            pEnd++;
        }else if(*pEnd == ' ' || *pEnd == '\0'){  //pEnd递增到空字符或到达结尾时,
            //翻转这一段字符串
            Reverse(pBegin, --pEnd); //--是为了去掉空字符
            pBegin = ++pEnd;  //并且将pBegin更新到pEnd,++是为了跳过空字符
        }else
            pEnd++;  //如果都不为空,就需要不断递增pEnd,直到它是空字符或到达结尾
    }
    return pData;
}

题目二(左旋转字符串):字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串”abcdefg”和数字2,该函数将返回旋转2位得到的结果”cdefgab”。

解题思路:

  1. 将字符串分为两部分,需旋转的为一部分,其余为第二部分。
  2. 分别翻转这两部分
  3. 再将整个字符串翻转就是结果

测试用例:

//测试用例
int main(){
    //输入字符串
    char str[16] = "I am a student.";
    //翻转单词顺序
    char *res = ReverseSentence(str);
    //输出结果
    if(res != NULL)
        std::cout << res << std::endl;  //Output: student. a am I

    //题目二测试
    //输入字符串
    char str2[8] = "abcdefg";
    //左旋转2位
    LeftRotateString(str2, 2);
    //输出结果
    std::cout << str2;  //Output: cdefgab

    return 0;
}

函数实现:

//题目二:左旋转字符串
//主函数,同样使用题目一的翻转字符串函数Reverse(...);
char* LeftRotateString(char *pStr, int n){
    if(pStr != 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值