剑指offer—左旋转字符串

Posted 宇哲_安菲尔德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
}

以上是关于剑指offer—左旋转字符串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode剑指 Offer 58 - II. 左旋转字符串(C++)

剑指offer左旋转字符串,C+实现

剑指offer-左旋转字符串

剑指offer python版 左旋转字符串

剑指Offer——左旋转字符串

剑指 Offer 58 - II. 左旋转字符串