爱旋不旋--旋转字符串

文章目录


旋转字符串

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB


题前认知:

一个字符串如果就定死了。eg:char arr[]=“dfdf”什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服)

所以字符串得是我们可输入的,才有可玩性,玩的不尽性就循环


暴力移位:

#include<stdio.h>
#include<string.h>

char* turn_left(char* arr, int num)
{
    int len = strlen(arr);
    int i = 0;
    //左旋数是多少就进行几次移位
    for (i = 0; i < num; i++)
    {
        //每次移位就是单次左旋
        int j = 0;
        char tmp = arr[0];//每次都把首元素存起来
        for (j = 0; j < len-1; j++)
        {           
            arr[j] = arr[j + 1];            
        }
        arr[len-1] = tmp;//把存起来的首元素放到最后一位
    }
    return arr;
}

int main()
{
    char arr[100] = {0};
    int num = 0;
    while (1)
    {
        printf("请输入想要旋转的字符串:>");
        gets(arr);
        printf("请输入想要左旋数:>");
        scanf("%d", &num);
        getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
        //下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
        printf("左旋字符串为:%s\n", turn_left(arr, num));
    }
    return 0;
}


输出结果

爱旋不旋--旋转字符串


三步翻转:

#include<stdio.h>
#include<string.h>
#include<assert.h>

void reverse(char* head, char* tail) //字符串逆序
{
    assert(head && tail);//断言阻止空指针
    char tmp = 0;
    char* ptmp = &tmp;
    while (head<tail)
    {
        tmp = *head;
        *head = *tail;
        *tail = tmp;
        head++;
        tail--;
    }
    return 0;
}
char* turn_left(char* arr, int num)
{
    assert(arr);
    int len = strlen(arr);
    if (len)
    {
        int n = num % len;           //防止num会越界操作,所以必须是num模len才可,还要保证len不为0
        reverse(arr, &arr[n - 1]);          //逆序左边
        reverse(&arr[n], &arr[len - 1]);  //逆序右边
        reverse(arr, &arr[len - 1]);      //逆序整体
        return arr;
    }
    else
    {
        return arr;
    }
}

int main()
{
    char arr[100] = {0};
    int num = 0;
    while (1)
    {
        printf("请输入想要旋转的字符串:>");
        gets(arr);
        printf("请输入想要左旋数:>");
        scanf("%d", &num);
        getchar();//这个的作用是清空缓冲区,因为每次scanf会有一个\n,不清空的话
        //下一次到了gets,他会认为\n是我们打进去的,所以scanf之后必须清空缓冲区
        printf("左旋字符串为:%s\n", turn_left(arr, num));
    }
    return 0;
}

爱旋不旋--旋转字符串

爱旋不旋--旋转字符串

还有3种方法但那三种就需要很强的数学功底了,具体的我也看不懂他怎么证明的数学公式,就不看了。哈哈哈


判断字符串旋转

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

题前认知

大家现在应该知道我干啥,没错我倡导交互,两个字符串都是我们写**

字符串追加判断==(面试的时候能用库函数就用库函数)==

什么叫字符串追加判断呢 例如asdfg这个字符串

爱旋不旋--旋转字符串

#include<stdio.h>
#include<string.h>
#include<assert.h>

int is_left_move(char* str1, char* str2)
{   
    assert(str1 && str2);
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    //长度不同就肯定不是旋转字符串
    if (len1 - len2)
        return 0;
    //在arr1字符串中追加一个自己
    strncat(str1, str1, len1);
    //判断判断的那个字符串是不是追加字符串的子串
    char* ret = strstr(str1, str2);
    if (ret == NULL)
        return 0;
    else
        return 1;
}

int main()
{
    char arr1[50] = {0};//有足够的空间
    char arr2[50] = {0};
    while (1)
    {
        printf("请输入字符串:>");
        gets(arr1);
        printf("请输入需判断的旋转字符串:>");
        gets(arr2);
        int ret = is_left_move(arr1, arr2);
        if (ret == 1)
        {
            printf("是旋转字符串\n");
        }
        else
        {
            printf("不是旋转字符串\n");
        }
    }   
    return 0;
}


结果

爱旋不旋--旋转字符串


上一篇:photoshop 快速画直线


下一篇:必应SEO:从Bing获得更多本地流量的8个技巧