剑指offer—左旋转字符串

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

对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后。然后依次再把b进行一次,就可以了。

这里写图片描述

代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void revolve_left(char str[], int k)
{
    assert(str);
    int len = strlen(str);//求得字符串的长度
    char tmp = 0;//用来保存你要移位的字符
    if (k < len)
    {
        for (int i = 0; i < k; i++)
        {
            tmp = str[0];
            for (int j = 0; j < len - 1; j++)
            {
                str[j] = str[j + 1];//对后面的字符串向前移位,
            }
            str[len - 1] = tmp;//把第一个字符放到最后的位置
        }
    }
    else
    {
        exit(1);
    }
}
int main()
{
    char str[] = "abcdefg";
    int k = 0;
    printf("输入你所需要旋转的字符个数:");
    scanf("%d", &k);
    revolve_left(str, k);
    printf("%s\n", str);
    system("pause");
    return 0;
}

上述程序就可以达到我们所要求的了,但是,其实有一种更为优化的方式可以来做这个,在这里我们把这个称为三步反转法

这里写图片描述

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void reverse(char *left,char *right)
{
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;

    }
}
void revolve_left(char *str, int k)
{
    int len = strlen(str);
    assert(str);
    if (k<len&&k>0 && len > 0)
    {
        reverse(str, str + k - 1);//第一步反转前一部分
        reverse(str + k, str + len - 1);//第二步反转第二部分
        reverse(str, str + len - 1);//第三步反转整体
    }
}
int main()
{
    char str[] = "abcdefg";
    int k = 0;
    printf("输入你所需要旋转的字符个数:");
    scanf("%d", &k);
    revolve_left(str, k);
    printf("%s\n", str);
    system("pause");
    return 0;
}

上面就是一种最快实现字符串左旋转操作的方法,接下来我们也来看一下右旋转操作的方法,类似依然使用三步旋转法。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void reverse(char *p, char *q)
{
    while (p < q)
    {
        char tmp = *p;
        *p = *q;
        *q = tmp;
        p++;
        q--;
    }

}
void RightLoopMove(char *pStr, unsigned short steps)
{
    int len = strlen(pStr);
    assert(pStr);
    reverse(pStr + len - steps, pStr + len-1);
    reverse(pStr, pStr + len - steps-1);
    reverse(pStr , pStr + len-1);
}
int main()
{
    char str[] = "abcdefg";
    RightLoopMove(str, 2);
    printf("%s\n", str);
    system("pause");
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值