有两个方法:
(1)暴力求解法
#include<string.h>
#include<stdio.h>
void left_move(char arr[])
{
int k=0;
scanf("%d",&k);//旋转个数
int i=0;
int len=strlen(arr);
for(i=0;i<k;i++)
{
//先将第一个字符拿出来,然后依次将后面的字符向前移一位,最后第一个字符放到数组最后一位
char tmp=arr[0];
int j=0;
for(j=0;j<len-1;j++)
{
arr[j]=arr[j+1];
}
arr[len-1]=tmp;
}
}
int main()
{
char arr[]="abcdef";
left_move(arr);//左旋转字符
printf("%s\n",arr);
return 0;
}
(2)三部翻转法
#include<stdio.h>
#include<string.h>
//旋转函数
void reverse(char *left,char *right)
{
while(left<right)
{
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void left_move(char arr[])
{
int len=strlen(arr);
//旋转k个字符
int k=0;
scanf("%d",&k);
//分三部旋转
reverse(arr,arr+k-1);//逆序左边 就假设逆序两个字符 ab逆序 整体变为bacdef
reverse(arr+k,arr+len-1);//逆序右边 此时的右边是cdef 逆序了两次(while循环) 整体变为bafedc
reverse(arr,arr+len-1);//逆序整体 整体逆序三次(16 25 34) 整体变为了cdefab
}
int main()
{
char arr[]="abcdef";
left_move(arr);
printf("%s\n",arr);
return 0;
}
判断字符串arr2是否为arr1旋转得来的
下面这些代码中出现了两个新的函数,strncat函数和strstr函数;strncat函数还有个相似的strcat函数,区别是:strncat可以自增自己字符串,strcat可以把两个字符串放一块,自增自己字符串不行;strstr函数则是判断字符串是否为所给字符串的子串的。它们都在库函数string.h中。
#include<stdio.h>
#include<string.h>
int is_left_move(char*str1,char*str2)
{
int len1=strlen(str1);
int len2=strlen(str2);
//判断两个字符串长度是否一样
if(len1!=len2)
{
return 0;
}
strncat(str1,str1,6);//在字符串str1中追加一个str1字符串,str1变为“abcdefabcdef"
char *ret=strstr(str1,str2);//判断str2指向的字符串是否是str1指向的字符串的子串
//strstr-找子串的函数
if(ret==NULL)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
char arr1[]="abcdef";
char arr2[]="cdefab";
int ret=is_left_move(arr1,arr2);
if(ret==1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
总结:理解后发现两个方法都很巧妙,非常考验思维能力。