实现一个函数,可以左右旋字符串中的k个字符
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符的到CDAB
ABCD右旋一个字符得到DABC
ABCD右旋两个字符的到CDAB
左旋:首先我们可以把第一元素放在一个临时变量中,然后将其他元素往前移动,然后把最后一个位置放入临时变量的值,这样我们我们就实现一个元素的左旋,重复这样的步骤,我们就可以得到左旋k次的字符串。
右旋:首先我们可以把第最后一个元素放在一个临时变量中,然后将其他元素往后移动,然后把第一个位置放入临时变量的值,这样我们我们就实现一个元素的右旋,重复这样的步骤,我们就可以得到右旋k次的字符串。
原理我们了解后我们来看下代码
#include<stdio.h>
#include<string.h>//运用strlen()函数指针要引用头文件#include<string.h>
void string_left_rotate(char* str,int k)
{
int i=0;
int n=strlen(str);//求字符串中的字符个数
for(i=0;i<k;i++)
{
//每旋转一个字符
char temp=*str;//临时变量
//后面的元素往前挪动
for(int j=0;j<n-1;j++)
{
*(str+j)=*(str+j+1);//后一个元素赋值给前一元素
}
*(str+n-1)=temp;//将临时变量赋值给最后一个元素
}
}
void string_right_rotate(char* str,int k)
{
int i=0;
int n=strlen(str);//求字符串中的字符个数
for(i=0;i<k;i++)
{
char temp=*(str+n-1);
for(int j=n-1;j>0;j--)
{
*(str+j)=*(str+j-1);//后一个元素被赋值给前一元素
}
*str=temp;//将临时变量赋值给第一个元素
}
}
int main()
{
char arr[10]="ABCDEF";
char brr[10]="ABCDEF";
int k=3;//左右旋的次数
string_left_rotate(arr,k);
string_right_rotate(brr,k);
printf("%s\n",arr);
printf("%s\n",brr);
return 0;
}
代码里有一些注释帮助大家理解。
相关的问题:
给出一个字符串brr[]看它是否是这个字符串arr[]经过左旋得到的,如果是,就给出经过多少次左旋得到的
其实我们可以在左旋的基础上,加一个比较的函数,函数库里面strcmp()就能帮助我们去实现比较的问题,了解原理之后,我们来看下代码
#include<stdio.h>
#include<string.h>//使用strcmp()函数,需要引用#include<string.h>
void string_left_rotate(char* str,int k)
{
int i=0;
int n=strlen(str);
for(i=0;i<k;i++)
{
//每旋转一个字符
char temp=*str;
//后面的元素往前挪动
for(int j=0;j<n-1;j++)
{
*(str+j)=*(str+j+1);
}
*(str+n-1)=temp;
}
}
int main()
{
char arr[10]="ABCDEF";
char brr[10]="ABCDEF";
int k=strlen(arr);//求出字符串中字符的个数
while(k)
{
char arr[10]="ABCDEF";
string_left_rotate(arr,k);
printf("%s\n",arr);//更清楚了解左旋了多少次
if(strcmp(arr,brr)==0)
{
printf("arr左旋%d次得到brr\n",k);
break;//如果我们找到了,我们就可以跳出循环,减少循环次数
}
k--;
}
if(k==0)
{
printf("arr左旋得不到brr\n");
}
return 0;
}
看完之后希望大家能够完全掌握,也欢迎大家指出其中的不足,谢谢大家