左旋字符串例如AABCD旋转一位后为ABCDA,旋转两位为BCDAA

1. 按位依次左旋

#include<stdio.h>
#include<Windows.h>
#include<string.h>
void left_move( char arr[],int len,int num)
{
    int i=0;
    int j=0;
    for(i=0;i<num;i++)//代表要旋转的个数
    {
        char temp=arr[0];//取出第一个字符
        for(j=0;j<len-1;j++)//代表把数组中的字符依次移动的次数,数组是从0开始的,所以字符实际个数是len-1个
        {
            arr[j]=arr[j+1];//依次移位
        }
        arr[len-1]=temp;//把第一个字符赋给数组的最后一位
    }
}
int main()
{
    char arr[10]="AABCD";
    int len=strlen(arr);
    left_move(arr,len,2);//2为要旋转的个数
    printf("翻转后的字符串为:%s\n",arr);
    system("pause");
    return 0;
}
  1. 三步翻转法
    其思想是将字符串分为两部分,例如:ABCDE分为AB和CDE,先把AB翻转为BA,再把CDE翻转为EDC,此时的字符串为BAEDC,在进行整体翻转,得到最终结果为CDEAB
#include<stdio.h>
#include<Windows.h>
#include<string.h>
void reverse(char*left,char*right)//翻转
{
    while(left<right)
    {
        *left^=*right;//此处为异或交换法,当然也可以用创建临时变量的方法
        *right^=*left;
        *left^=*right;
        left++;
        right--;
    }
}
void left_move(char *arr,int len,int num)
{
    reverse(arr,arr+num-1);//翻转AB
    reverse(arr+num,arr+len-1);//翻转CDE
    reverse(arr,arr+len-1);//字符串BAEDC整体翻转
}
int main()
{
    char arr[10]="ABCDE";
    int len=strlen(arr);
    left_move(arr,len,2);
    printf("翻转后的字符串为:%s\n",arr);
    system("pause");
    return 0;
}

3. 运用库函数完成旋转
strcpy字符串拷贝strcat字符串连接strncpy也是字符串拷贝但有长度的限制例如字符串ABCDE连接后为ABCDEABCDE此时若num=2那么此时指针new_arr+num就从c处开始拷贝len长度个为CDEAB

void left_move(char*arr,int len,int num)
{
    int new_len=2*len+1;//加1为'\0'
    char*new_arr=(char*)malloc(new_len);//动态内存开辟
    num%=len;//提高效率,当num足够大的时候,翻转len长度次还是他本身
    strcpy(new_arr,arr);
    strcat(new_arr,arr);
    strncpy(arr,new_arr+num,len);
    free(new_arr);
}
int main()
{
    char arr[10]="ABCDE";
    int len=strlen(arr);
    left_move(arr,len,2);
    printf("翻转后的字符串为:%s\n",arr);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值