实现字符左旋转的两个方法总结和相关例题分析

左旋转字符串-->>要求是实现一个函数,可以左旋字符串中的k个字符;例如:ABCD左旋一个字符得到BCDA;ABCD左旋两个字符得到CDAB-->>

方法一:单个循环翻转法

 //单个循环翻转法对每个字符进行操作,将其移动到字符串的最后,如上图,传入的移动次数为2,因此进行两次操作,然后将下一位的字符移动到前面一位;

方法二:三部翻转法

//三部翻转法将要进行左旋转的部分和其他部分分离开来,分别进行逆序,最后逆序完的结果再重头到尾进行一次逆序,如下面的过程可以简述为:abcdef-ab cdef ->>ba fedc->>cdefab; 

下面是一道例题:

//题目要求: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后得到的字符串,给定两个字符数组-->>char arr1[] = "abcdef";char arr2[] = "cdefab",代码大致如下:

 

 

 //大致思路: 通过is_left_move函数的返回值来进行判断是否相等,其中将arr1进行每一次进行一次左旋转的操作,每一次结果利用strcmp函数(//strcmp函数的格式为->>strcmp(arr1,arr2),如果两者相等则返回0)进行判断;此外,对于每一次的左旋转,此处将其传入一个left_move的函数中进行操作-->>left_move函数传入的参数包括要进行操作的字符数组首字母地址,以及要进行逆序的次数,其内部通过上述的三部逆序法实现左旋转的过程。

//但是这样的代码存在不足的地方,即当假设arr1="abcdef",arr2="cdefabcdefab"则无法实现;

下面进行进一步代码的优化:

 

 //在上述is_left_move函数中,引入strncat()函数以及strstr()函数;下面先简单讲述以下strcat以及strncat两个函数的差别,以及strstr()函数的用法:

-->>1.strncat与strcat函数: strcat(str1,str2)表示在字符串str1后面加上str2,对应的参数有两个;strncat(str1,str1,int n)表示在字符串str1后面加上str1,对应的参数有int n 个;

-->>2.strstr(str1,str2)函数用于在str1字符串中找到str2字符串,如在"abcdefabcdef"中找到字符串"cdefab",显然成立;其中对于函数strstr(str1,str2),若找到则返回str2,否则返回NULL;

-->>3.此种方法可以用来替代前面的方法的原因在于利用strncat以及strstr函数进行查找每隔一位进行后面n位数的查找可以找到所有的左旋转后的字符数组,因此只要strstr函数返回值不为NULL;即可以在str1中找到str2,那么就可以说明一个字符串是为另外一个字符串旋转之后得到的字符串。

-------------------------------------------------------------------------------------------------------------------------------

//下面再对strcat函数和strstr函数进行详细解析:

1.strcat(arr1,arr2)的实现过程在于先移动arr1指针位置到'\0'处停下来,接着将arr2的内容补充到后面,这里我建立一个my_strcat函数进行解析: 

# 对于while (*arr1++ = *arr2++)的操作来说,是将arr2的每一个元素赋值到arr1从'\0'位置开始之后,直到其将'\0'赋值到arr1中,此时*arr1++为'\0',而'\0'也就是0,因此会跳出循环。

2.strstr(arr1arr2)函数的实现过程是在arr1中找arr2的字符串,若找到则返回arr2,否则返回NULL;下面通过一个my_strstr()含函数来进行分析:

 

//创建一个cur变量的目的在于可以一次次反复进行筛选和匹配,例如在"abbbcc"中找"bbc",若在一开始找到同一个b变量就进行判断的话,会出现问题,此时cur++就可以使指向arr1中第一个b的指针后移一个位置,这样就可以再次进行判断;

//注意:要对cur进行char*的强制类型转换;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值