翻转字符串 VS 左旋转字符串

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

第一步:翻转句子中的所有字符,比如翻转”I am a student.”中的所有字符得到”.tneduts a ma I”,此时不但翻转了句子中单词的顺序,每个单词内的字符也被翻转了。第二步,再翻转每个单词中字符的顺序,就得到了”student. a am I”。

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

char* ReverseSentence(char* str)
{
    if (str == NULL)
        return NULL;
    char* begin = str;
    char* end = str;
    while (*end != '\0')
    {
        end++;
    }
    end--;//因为此时end在\0处,所以需要向前一位到最后一个字符的位置

    Reverse(begin, end);//翻转整个句子

    //翻转句子中的每个单词
    begin = end = str;
    while (*begin != '\0')
    {
        if (*begin == ' ')
        {
            begin++;
            end++;
        }
        //每一个单词当end为空格时旋转
        else if (*end == ' ' || *end == '\0')
        {
            Reverse(begin, --end);
            begin = ++end;
        }
        else
        {
            end++;
        }
    }
    return str;
}

int main()
{
    char str[] = "I am a student.";
    char* ret = ReverseSentence(str);
    cout << ret << endl;
    system("pause");
    return 0;
}

这里写图片描述

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

我们可以考虑将字符串分为两部分,由于所传的数字是2,即我们要把它的前两个字符串移到后面,我们把前两个字符串当作第一部分,对它进行旋转得到”ba”,再将后面的字符当作另一部分进行旋转,得到”gfedc”,此时字符串变为”bagfedc”,再将它进行整体旋转,得到”cdefgab”,即将字符串左旋两位的结果。

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

char* LeftReverse(char* str, int n)
{
    if (str != NULL)
    {
        int len = strlen(str);
        if (len > 0 && n > 0 && n < len)
        {
            char* start1 = str;
            char* end1 = str + n - 1;
            char* start2 = str + n;
            char* end2 = str + len - 1;

            //翻转前n个字符
            Reverse(start1, end1);
            //翻转后面的字符
            Reverse(start2, end2);
            //翻转整个字符串
            Reverse(start1, end2);
        }
    }
    return str;
}


int main()
{
    char str[] = "abcdefg";
    char *ret = LeftReverse(str, 2);
    cout << ret << endl;
    system("pause");
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值