实现一个函数,可以左旋字符串中的k个字符。
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
1、可以通过字符串互换,每左旋一次,字符串第一个移到最后一个,其余字符整体向前移动一位。
代码如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> void reverse(char *str,int len,int k) { int i; while(k--) {//左旋几次,整个字符串调整几次 char tep=str[0];//第一个元素和最后一个元素互换 for(i=0;i<len-1;i++) { str[i]=str[i+1]; } str[len-1]=tep; } } int main() { char arr[10]={0}; int len,k; gets(arr); scanf("%d",&k); len=strlen(arr); k=k%len;//如果左旋次数大于字符串长度出现重复,所以要k需要模len reverse(arr,len,k); printf("%s\n",arr); system("pause"); return 0; }
2、上述方法效率较低。也可以把整个字符串看成两部分,然后逆置,在整体进行逆置就可以实现左旋k个字符。
代码如下:
#include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> void revolve(char *left,char *right) { while(left<right)//进行逆序排列 { char temp=*left; *left=*right; *right=temp; left++; right--; } } void left_move(char *str,int len,int k) { assert(str);//指针有效性判断 revolve(str,str+k-1);//逆序需要左旋的部分 revolve(str+k,str+len-1);//逆序其余字符 revolve(str,str+len-1);//逆序整个字符串 } int main() { char arr[10]={0}; int len,k; gets(arr); scanf("%d",&k); len=strlen(arr); k=k%len;//如果左旋次数大于字符串长度出现重复,所以要k需要模len left_move(arr,len,k); printf("%s\n",arr); system("pause"); return 0; }