实现一个函数,可以左旋字符串中的字符。
如,现将abcdef左旋4个字符得到efabcd。
方法一:暴力求解法
#include<stdio.h>
#include<string.h>
#include<assert.h>
void left_move(char* arr,int k)
{
assert(arr!=NULL);
int i=0;
int len=strlen(arr);
for(i=0;i<k;i++)
{
char tmp=*arr;
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,4);
printf("%s\n",arr);
return 0;
}
方法二:三步翻转法
思路如下:
//abcdef
//dcba fe 将abcdef分成两部分,分别进行逆序
//efabcd 将分开的两部分进行整体逆序
#include<stdio.h>
#include<string.h>
#include<assert.h>
//逆序字符串的函数
void reverse(char* left,char* right)
{
assert(left!=NULL);
assert(right!=NULL);
while(left<right)
{
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void left_move(char* arr,int k)
{
assert(arr);
int len=strlen(arr);
assert(k<=len);
reverse(arr,arr+k-1);//逆序左边
reverse(arr+k,arr+len-1);//逆序右边
reverse(arr,arr+len-1);//逆序整体
}
int main()
{
char arr[]="abcdef";
left_move(arr,4);
printf("%s\n",arr);
return 0;
}