C语言之字符串左旋or右旋的方法及思路

    在C语言的学习过程中,字符串是我们经常会遇到的,并且对字符串的一些操作、变化、改变都是我们应该做注重的。其中我认为一个比较有特色的变化就是对字符串进行左旋或者右旋。
    左旋如下:
    一个字符串为         abcd1234    
    左旋两位以后应该为    cd1234ab
    右旋同理:
    一个字符串为         abcd1234  
    右旋两位以后应该为    34abcd12
    这时候我们发现,右旋与左旋其实有相似之处,右旋两次相当于左旋了六次。所以,这里我们就以左旋为例。


    方法一:字符串左旋三次,我们分步进行,先让字符串左旋一次,得到结果以后,再让字符串左旋一次,循环进行,直至要求的左旋次数即可。
    如下图:

这里写图片描述

    此时的 d1234abc 就是目的左旋字符串,其代码如下。
void reverse_left_1(char *str, int n, int len)
{
    int i = 0, j = 0;
    char temp = 0;

    n %= len;//判断左旋的有效次数
    for (i = 0; i < n; i++)//左旋的总次数
    {
        temp = str[0];//保存第一个元素
        for (j = 0; j < len - 1; j++)//左旋一次
        {
            str[j] = str[j + 1];//将后一位元素放置其前一位
        }
        str[j] = temp;//将第一个放置最后一个,完成左旋一次后的结果
    }
}

int main()
{
    char str[] = "abcd1234";
    int n = 0, len = strlen(str);

    printf("please enter->");
    scanf("%d", &n);//输入左旋的次数
    printf("before reverse_left string is :%s\n", str);
    reverse_left_1(str, n, len);
    printf("reverse_left string is :%s\n", str);

    system("pause");
    return 0;
}

这里写图片描述

    方法二:分段进行操作,先将字符串按照左旋次数进行分段,接着分别将两段字符串进行逆置,然后再将字符串整体逆置即可。
    如下图:

这里写图片描述

    此时的 d1234abc 就是目的左旋字符串,其代码如下。
void swap(char *start, char *end)
{
    while (start < end)
    {
        *start ^= *end;
        *end ^= *start;
        *start ^= *end;
        start++, end--;
    }
}

void reverse_left_2(char *str, int n, int len)
{
    char *mid = NULL;//定义一个指针,将指向左旋分段点

    n %= len;//判断左旋的有效次数
    mid = str + n - 1;//指向分段点的最后一个字符
    swap(str, mid);//逆置前一段字符串
    swap(mid + 1, str + len - 1);//逆置后一段字符串
    swap(str, str + len - 1);//整个字符串逆置
}

int main()
{
    char str[] = "abcd1234";
    int n = 0, len = strlen(str);

    printf("please enter->");
    scanf("%d", &n);//输入左旋的次数
    printf("before reverse_left string is :%s\n", str);
    reverse_left_2(str, n, len);
    printf("reverse_left string is :%s\n", str);

    system("pause");
    return 0;
}

这里写图片描述

    方法三:将原字符串自身与自身进行拼接形成长串,此时的长串内包含所有可能左旋的结果,在其中进行筛选读取即可。
    如图:

这里写图片描述

    此时的 d1234abc 就是目的左旋字符串,其代码如下。
void reverse_left_3(char *str, int n, int len)
{
    char str1[32];//创建一个新的字符数组来存放将来的长串

    n %= len;//判断左旋有效次数
    strcpy(str1, str);//将原串先拷入新的字符数组
    strcat(str1, str);//两个原串连接
    strncpy(str, str1 + n, len);//读取左旋后的目的字符串
}

int main()
{
    char str[] = "abcd1234";
    int n = 0, len = strlen(str);

    printf("please enter->");
    scanf("%d", &n);//输入左旋的次数
    printf("before reverse_left string is :%s\n", str);
    reverse_left_3(str, n, len);
    printf("reverse_left string is :%s\n", str);

    system("pause");
    return 0;
}

这里写图片描述

本人愚见,欢迎大家共同探讨研究,如果错误,请及时联系作者进行修改更正,谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值