题目名称:
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
1.方法一
代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
//算法一简洁明了版
void left_move(char* arr,int k,int len)
{
assert(arr); //诊断arr是否有效
int i,j;
for(i=0;i<k;i++)
{
char tmp=*arr; //将第一个字符存起来
for(j=0;j<len-1;j++)
{
*(arr+j)=*(arr+j+1); //将arr+j+1的字符赋值给arr+j ;列如:将第二个的位置赋值上第三个位置的字符
}
*(arr+j)=tmp; //将“\0 ”前的位置,赋值上第一个的字符
}
}
int main(void)
{
char arr[100]={NULL};
int k,len;
printf("输入字符:");
scanf("%s",arr);
printf("输入要向左移几个字符:");
scanf("%d",&k);
len=strlen(arr);
left_move(arr,k,len);
printf("%s",arr);
}
2.方法二
假如你要放转“abcde” 2位,那么你可以把“abcde”,看成“ ab” 和“cde”两部分;
1.你先吧“ab”反转,成了“ba”
2.然后把“cde”反转,成了 “edc”
3.最后吧“baedc”整体反转,成为“edcba”
代码
#include<stdio.h>
#include<string.h>
#include<assert.h>
//算法2 优化版
void revese(char* left,char* right)
{
assert(left!=NULL); //判断 left 是否为空指针
assert(right!=NULL);//判断 right 是否为空指针
while(left<right)
{
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void left_move(char* arr,int k,int len)
{
assert(arr); //诊断arr是否有效
assert(k<=len); //保证输入的k有效,你不能反转一个知不道的
revese(arr,arr+k-1); //反转k前及其k的几个字符
revese(arr+k,arr+len-1);//反转k后几个字符
revese(arr,arr+len-1); //反转整体字符
}
int main(void)
{
char arr[100]={NULL};
int k,len;
printf("输入字符:");
scanf("%s",arr);
printf("输入要向左移几个字符:");
scanf("%d",&k);
len=strlen(arr);
left_move(arr,k,len);
printf("%s",arr);
}