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

来源:互联网 发布:离开雷锋的日子 知乎 编辑:程序博客网 时间:2024/05/29 03:07

ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
以下通过三种方法来实现:

//方法一//将字符串除第一个字符外的所有字符左移,再将第一个字符放置最后一位,操作N次static leftmove(char *str, int len){    char tmp = str[0];    int i = 0;    for (i = 0; i < len - 1; i++)    {        str[i] = str[i + 1];    }    str[i] = tmp;}void left_reverse(char *str, int len, int n){    assert(str);    assert(len>0);    assert(n>0);    n %= len;    while (n--)    {        leftmove(str, len);    }}
//方法二//以n为界,将字符串分成两部分,先分别逆置,再整体逆置static void reverse_string(char *start, char *end){    assert(start);    assert(end);    while (start < end)    {        *start ^= *end;        *end ^= *start;        *start ^= *end;        start++;        end--;    }}void left_reverse1( char *str,int len, int n){    assert(str);    assert(len > 0);    assert(n > 0);    n %= len;    reverse_string(str, str + n - 1);    reverse_string(str + n, str + len - 1);    reverse_string(str, str + len - 1);}
//方法三//将两字符串拼接在一起,利用子串查找找到左旋后的字符串void left_reverse2(char *str, int len, int n){    assert(str);    assert(len > 0);    assert(n > 0);    n %= len;    int newsize = 2 * len + 1;    char *mem = (char *)malloc(sizeof(char)*newsize);//开辟内存    strcpy(mem, str);//将字符串str拷贝到mem中    strcat(mem, str);//再将字符串str拼接在mem上    strncpy(str, mem+n, len);//在mem中从n个字符开始拷贝和原先str字符串长度相等个字符到str上    free(mem);//释放内存}

测试用例:

int main(){    char str[] = "abcd";    int n = 0;    int sz = sizeof(str) / sizeof(str[0])-1;    printf("please input left_reverse num:");    scanf("%d", &n);    left_reverse2(str, sz, n);    printf("%s", str);    return 0;}

要判断一个字符串是否为另一个字符串左旋后的字符串,我们采用刚刚代码三的方法,代码如下:

#include <stdio.h>#include <assert.h>#include <string.h>int find_leftmove(char *str, char *substr){    assert(str);    assert(substr);    int len1 = strlen(str);    int len2 = strlen(substr);    if (len1 != len2)    {        return -1;//若两字符串长度不等,直接返回-1    }    int newsize = len1 * 2 + 1;    char *mem = (char *)malloc(sizeof(char)*newsize);    strcpy(mem, str);    strcat(mem, str);    if (strstr(mem, substr))    {        return 1;//若在mem中能够查找到所要求的字符串,即它是左旋后的字符串,返回1    }    free(mem);}int main(){    char str[] = "abcdef";    int ret = find_leftmove(str, "bcdefa");    if(ret==1)    {       printf("Yes!\n");    }    else    {       printf("No\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击