C语言数组中字符串的旋转(左旋与右旋)

栏目: C · 发布时间: 5年前

内容简介:在数组中定义一个字符串,该字符串由“ abcdef ” 组成,所谓左旋即是让左边的第一个字符旋转到右边去,左旋一个字符即是产生“ bcdefa ”这样的字符串,右旋与之相反。为了控制左(右)旋的字符数,需要制作一个可以改变旋转字符数的函数。字符串的旋转的主要si思想是将需要寻转的字符先进行存储,然后将剩余的不需要旋转的字符移位,将需要旋转的字符的位置取代,为旋转的字符留下足够的空间来存储旋转字符。所以先建立一个数组,将旋转字符存储在内,然后将原数组内的元素移位后面的元素取代其前面的元素,但万不可将 " \0

在数组中定义一个字符串,该字符串由“ abcdef ” 组成,所谓左旋即是让左边的第一个字符旋转到右边去,左旋一个字符即是产生“ bcdefa ”这样的字符串,右旋与之相反。

为了控制左(右)旋的字符数,需要制作一个可以改变旋转字符数的函数。

字符串的旋转的主要si思想是将需要寻转的字符先进行存储,然后将剩余的不需要旋转的字符移位,将需要旋转的字符的位置取代,为旋转的字符留下足够的空间来存储旋转字符。所以先建立一个数组,将旋转字符存储在内,然后将原数组内的元素移位后面的元素取代其前面的元素,但万不可将 " \0 " 移动或取代,要始终保证 " \0 " 在其原来的位置,然后将所存储的元素再次赋值到原数组中,完成旋转。最后再将数组元素循环打印在屏幕上。

一.字符串的左旋(右旋)

由于左旋和右旋思路一致,这里仅介绍左旋方法。

这种题目有两种思路:

1.首字符的后置以及其余元素的往前推置,循环重复此过程K次(k为左旋字符个数)。

eg:

字符串为“ABCDEF\0”,要旋转2个字符,

首先保存首字符到一个变量,然后把其余变量全部提前一位置放,即为“BCDEF \0”(此处注意,最后的终止符\0不要提前,留出一个空位)

再把用来保存的变量给字符串最后一个位置(除\0外),即为“BCDEFA\0”

再做一次此过程即为“CDEFGA \0”——》“CDEFGAB\0”

C语言数组中字符串的旋转(左旋与右旋)

源代码:

#include

#include

#include

void Exchange(char *str, int k)

{

int i,m;

char temp;

char *sta;

for (i = 0; i < k; i++)

{

sta = str;

temp = *str;//保存首字符

for (m = 0; m <= (int)strlen(str)-1; m++)//元素提前放置

{

*sta = *(sta + 1);

sta++;

}

*(str+strlen(str)) = temp;//将首字符放置最后

}

}

int main()

{

int leng;

printf("请输入要左旋几个字符\n");

scanf("%d", &leng);

char str[] = "ABCDEFG";

Exchange(str,leng);

printf("%s\n", str);

return 0;

}

C语言数组中字符串的旋转(左旋与右旋)

2.三步旋转法

这种方法是由观察得来,旋转后的字符串有此规律:

旋转前“ABCDEFG”

旋转后“CDEFGAB”

将旋转后的字符逆置得

“CDEFGBA”

将未旋转的字符逆置得

“GFEDCBA”

再将全部字符逆置就得到了原来的字符串“ABCDEFG”

原字符串旋转时反向操作即可

源代码:

#include

#include

#include

void reverse(char *left, char *right)//逆置函数

{

char temp;

while (left < right)

{

temp = *left;

*left = *right;

*right = temp;

left++; right--;

}

}

void Exchange(char *str, int leng)//三步逆置

{

reverse(str, str + leng-1);

reverse(str + leng, str+strlen(str)-1);

reverse(str, str + strlen(str) - 1);

}

int main()

{

int leng;

printf("请输入要左旋几个字符\n");

scanf("%d", &leng);

char str[] = "ABCDEFG";

Exchange(str,leng);

printf("%s\n", str);

system("pause");

return 0;

}

二.判断一个字符串是否是由另一个字符串旋转而来

1.第一种思路是不借助字符串库函数,将需要判断的字符串按照三步逆置法判断是否和原字符串相同,但是这种方法效率较差,而且时间复杂度高。

源代码:

#include

#include

#include

void reverse(char *left,char *right)

{

char temp;

while (left < right)

{

temp = *left;

*left = *right;

*right = temp;

left++; right--;

}

}

int judgeStr(char str1[],char str2[],char str3[])

{

int i,m=0,sum=0,s;

char *sta ;

char *fina ;

int length = strlen(str1);

for (i = 0; i <(int)strlen(str2); i++)

{

str3[i] = str2[i];

}

for (i = 0; i <= (int)strlen(str1) - 1; i++)

{

sta = str3;

fina = str3 + strlen(str1) - 1;

reverse(sta, sta + i);

reverse(sta + i + 1, fina);

reverse(sta, fina);

for (; m < (int)strlen(str1); m++)

{

if (str1[m] != str3[m])

{

sum++;

break;

}

}

for (s = 0; s<(int)strlen(str2); s++)

{

str3[s] = str2[s];

}

if (sum == 4)

{

return 0;

}

}

return 1;

}

int main(void)

{

char str1[] = "ABCDE";

char str2[] = "BCDEA";

char str3[] = "BACDE";

char stra[] = "AAAAA";

int judge;

judge = judgeStr(str1, str2,stra);

if (judge == 1)

{

printf("str2是由str1旋转得来的\n");

}

else

{

printf("str2不是由str1旋转得来的\n");

}

judge = judgeStr(str1, str3,stra);

if (judge == 1)

{

printf("str3是由str1旋转得来的\n");

}

else

{

printf("str3不是由str1旋转得来的\n");

}

system("pause");

return 0;

}

2.使用字符串库函数解决

使用此方法需要注意到一个规律:

一个字符串后面再接一个和自身相同的字符串后,此字符串中就出现了所有旋转可以得到的结果。

eg:

A B C D A B C D,其中有所有的“ABCD”旋转结果,BCDA(2~5),CDAB(3~6),DABC(4~7)。

所以做法就是利用库函数将原字符串拼接一个自身,再在字符串中查找需要判断的字符串即可。

源代码:

#include

#include

int judge(char *str1, char *str2)

{

strncat(str1, str1, strlen(str1));//原字符串拼接本身

char *result = strstr(str3, str2);//查找目标字符串

if (result == NULL)

{

return -1;

}

else

{

return 0;

}

}

int main()

{

char str1[] = "ABCDE";

char str2[] = "CDEAB";

char str3[] = "DEBAC";

int result = judge(str1, str2);

if (result == -1)

{

printf("str2不是由str1旋转得到\n");

}

else

{

printf("str2是由str1旋转得到\n");

}

result = judge(str1, str3);

if (result == -1)

{

printf("str3不是由str1旋转得到\n");

}

else

{

printf("str3是由str1旋转得到\n");

}

system("pause");

return 0;

}

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-04/158366.htm


以上所述就是小编给大家介绍的《C语言数组中字符串的旋转(左旋与右旋)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆流行

引爆流行

[美] 马尔科姆·格拉德威尔 / 钱清、覃爱冬 / 中信出版社 / 2002-7 / 18.00元

马尔科姆·格拉德威尔以社会上突如其来的流行风潮研究为切入点,从一个全新的角度探索了控制科学和营销模式。他认为,思想、行为、信息以及产品常常会像传染病爆发一样,迅速传播蔓延。正如一个病人就能引起一场全城流感;如果个别工作人员对顾客大打出手,或几位涂鸦爱好者管不住自己,也能在地铁里掀起一场犯罪浪潮;一位满意而归的顾客还能让新开张的餐馆座无虚席。这些现象均属“社会流行潮”,它爆发的那一刻,即达到临界水平......一起来看看 《引爆流行》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器