1.实现一个函数,可以左旋字符串中的k个字符;2,判断一个字符串是否为另外一个字符串旋转之后的字符串。

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

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

#include <stdio.h>
#include <stdlib.h>

int length (char *arr)//求字符串长度
{
    int i = 0;
    while (arr[i])
    {
        i++;
    }
    return i;
}

void revolve_arr(char *arr, int len, int num)//旋转字符函数
{
    int i = 0, j = 0, t = 0;//i,j为循环变量,t为临时变量,用于字符交换
    for (i=0; i<num; ++i)
    {
        for (j=0; j<len-1; ++j)//此处j的范围不能为len,否则就会把‘\0’前移,使字符串提前结束
        {
            t = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = t;
        }
    }
}
int main()
{
    char arr[10] = {"ABCDEFGHI"};
    int num = 0;//要旋转的字符个数
    int len = length (arr);
    printf ("旋转前:\n%s\n",arr);
    printf("请输入你要旋转的字符个数:\n");
    scanf ("%d",&num);
    revolve_arr(arr, len, num);
    printf ("旋转后:\n%s\n",arr);
    system ("pause");
    return 0;
}
/*
运行结果:
旋转前:
ABCDEFGHI
请输入你要旋转的字符个数:
3
旋转后:
DEFGHIABC
请按任意键继续. . .
*/

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

方法一:用第一个字符串旋转n次(n为字符串长度)后得到的字符串分别与第二个字符串比较,要是有相等的就说明第二个是第一个通过旋转得到的 ,如果都不相同就不是。

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

#define NUM 6

//arr2是arr1旋转得到的返回1,不是返回0
int Is_revolve(char *arr1, char *arr2)
{
    int i=0, j = 0;
    char t = '0';
    for (i=0; arr1[i]!='\0'; i++)
    {
        for (j = 0; arr1[j+1] != '\0'; ++j)
        {
                t  = arr1[j];
                arr1[j] = arr1[j+1];
                arr1[j+1] = t;
        }
        if (strcmp(arr1, arr2) == 0)//判断两个字符串是否相等,相等返回0,不相等返回1
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    int ret = 0;
    char arr1[NUM];
    char arr2[NUM];
    printf ("arr1:\n");
    scanf ("%s", arr1);
    printf ("arr2:\n");
    scanf ("%s", arr2);
    char *p = arr1;
    ret = Is_revolve(p, arr2);
    if(ret == 1)
    {
        printf ("arr1是arr2旋转得到的!!!\n");
    }
    else
    {
        printf ("arr1不是arr2通过旋转得到的\n");
    }
    system ("pause");
    return 0;
}
/*
运行结果:
arr1:
abcde
arr2:
cdeab
arr1是arr2旋转得到的!!!
请按任意键继续. . .
*/

上面那个方法虽然可以判断结果,但是非常麻烦,需要多次循环比较才可以得出答案,所以通过对旋转后的字符串仔细观察就可以看出:

这里写图片描述

这里写图片描述

不管是左旋还是右旋,旋转后的字符串都是原字符串经过拷贝后的字符串的子串所以可以用判断子串的函数(strstr();)来判断,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 6

int Is_revolve(char *arr3, char *arr2)
{
    if((strstr(arr3, arr2)) != NULL)//若arr2是arr3的子串,则返回arr2在arr3的首次出现的地址;如果arr2不是arr3的子串,则返回NULL。
        return 1;
    else
        return 0;
}
int main()
{
    int ret = 0;
    char arr1[NUM];
    char arr2[NUM];
    char arr3[NUM+NUM+1];//存放arr1的值两次的一个数组
    printf ("arr1:\n");//输入arr1
    scanf ("%s", arr1);
    printf ("arr2:\n");//输入arr2
    scanf ("%s", arr2);
    strcpy (arr3, arr1);//把arr1的值先赋给arr3
    strcat (arr3, arr1);//把arr1的值在接在arr1原来的值的后边
    ret = Is_revolve(arr3, arr2);
    if(ret == 1)
    {
        printf ("arr1是arr2旋转得到的!!!\n");
    }
    else
    {
        printf ("arr1不是arr2通过旋转得到的\n");
    }
    system ("pause");
    return 0;
}
/*
运行结果:
arr1:
abcde
arr2:
cdeab
arr1是arr2旋转得到的!!!
请按任意键继续. . .
*/

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/80004566