您的位置:首页 > 其它

自学day1:字符串的移位旋转

2015-12-17 12:31 267 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzp1666155449/article/details/50338389

问题描述:给定一个字符串,将字符串字符串左移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
;
s[n--]=t;
}
}

因此此方法的时间复杂度为O(n)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: