问题描述:给定一个字符串,将字符串字符串左移m位
例如
输入:abcdefg
4
输出:efgabcd
解法一:最简单的思路,循环左移,时间复杂度O(mn)
#include<stdio.h>
#include<String.h>
void ExchangeS(char *s,int n);
int main()
{
char s[100];
int m;
printf("输入字符串:");
scanf("%s",&s);
printf("输入左移位数:");
scanf("%d",&m);
int n=strlen(s);
m%=n;//左移位数m大于字符串长度n时,与%n等价
while(m--){//左移m次,使开头的m个字符串移到尾部
ExchangeS(s,n);
}
puts(s);
return 0;
}
void ExchangeS(char *s,int n)//左移
{
char t=s[0];
int i=1;
for(i;i<n;i++)
{
s[i-1]=s[i];
}
s[n-1]=t;
}
解法二:三步反转法
1.将字符串分为两部分
2..将所分的两部分中的所有字符反转,即abcd→dcba,efg→gfe
3.将上述得到的结果整体翻转,即dcbagfe→efgabcd
#include<stdio.h>
#include<String.h>
void ExchangeS(char *s,int m,int n);
int main()
{
char s[100];
int m;
printf("输入字符串:");
scanf("%s",&s);
printf("输入左移位数:");
scanf("%d",&m);
int n=strlen(s);
m%=n;//左移位数m大于字符串长度n时,与%n等价
ExchangeS(s,0,m-1);
ExchangeS(s,m,n-1);
ExchangeS(s,0,n-1);
puts(s);
return 0;
}
void ExchangeS(char *s,int m,int n)
{
char t;
while(m<n){
t=s[m];
s[m++]=s[n];
s[n--]=t;
}
}
因此此方法的时间复杂度为O(n)