关于字符串旋转的三种解法(入门题型)
前言
大家请看这道题,是需要自己实现字符串旋转,旋转几个字符自己指定,这个算是比较基础的题型吧,我这里有三种解法,接下来的通过画图和代码先进行第一种解法的讲解,题目如下图:
大家可以看到,字符ABCD经过了一次旋转变成了BCDA
如图所示:
这个是第一种解法的大概过程,接下来给大家讲解如何实践字符串的交换:
#include
//字符串字符旋转
#include
void bubbling(char*arr,int sz,int n)
{
assert(arr);
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
char tmp = 0;
for (j = 0; j < sz-1;j++)
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
void print(char*arr)
{
printf("%s \n", arr);
}
int main()
{
char arr[] = "abcd";
int sz = sizeof(arr) / sizeof(arr[0])-1;
int n = 0;
printf("请输入要交换的次数\n");
while (~scanf("%d", &n))
{
bubbling(arr, sz, n);//用冒泡交换来实现字符旋转
print(arr);
printf("请输入要交换的次数\n");
}
return 0;
}
这个是我写的一个交换的代码,是由数组进行交换的大家可以看一下,下面为大家解析如何用数组一个一个交换,其实原理和冒泡排序一样,就是一个外循环,一个内循环,外循环负责控制旋转的字节的数量,如果我们的n输入1,那就是旋转一次,如果是2,就是旋转2次,接下来给大家讲解内循环,
大家可以看见我们的arr[0]先和arr[1]交换,其次是arr[1]和arr[2]交换如此往复,大家就会想到冒泡排序也是一个一个进行交换,但是冒泡排序比这个多了个判定条件,假如是升序,就只能第一个比第二个元素大的时候交换,但是这个不用,只需要完成交换就可以,如图:
这里的第一个参数是字符串首元素的地址,第二个参数是字符串中字符的个数(不包含/0),第三个参数也就是我们自己输入的要旋转字符的个数,
大家可以看到紫色框框是外循环,用来进行交换几个字符的判断,内循环是红色框框,我们设置了一个变量tmp用它去接收我们arr[j]的值,然后我们再将arr[j]的值变成arr[j+1]的值,就这样循环交换,因为我们有4个字符,我们就需要交换三次,如图所示
所以我们的判断条件就是sz-1,(我们在求字符串大小的时候注意sizeof(arr)会把'\0'也计算再内,所以我们算到最后要进行-1操作,这样我们的sz才是我们的字符数)因为sz-1就是咱们以本图为准,当我有4个字符数时,我们就需要交换3次,因为j从0开始,所以当j=2时正好是0,1,2交换了三次,于是就得到了:
当我输入1是旋转一次,成为了如图所示的字符串,当然我在前面也讲过,控制字符交换的个数用n来进行,如果n为2就是交换两个字符如图:
大家可以看到ab旋转到了后面由abcd变成了cdab
好了这大概就是第一种解法的讲解了,接下来我在后续还会补充第二种写法,第二种写法我个人比较推荐,那这次就到这里了,大家可以点个赞,就当对新人的支持啦!!!
谢谢大家!!!