把一个字符串左选择操作:吧字符串前面的的若干字符移动到字符串的尾部,如吧字符串的abcdef左旋转2位得到字符串cdefab。
思路1.暴力移位发
把移动m部拆分成移动一步。
void leftshiftone(char* s,int n){
char t=s[0];
for(int i=1;i<n;++i)
{
s[i-1]=s[i];
}
s[n-1]=t;
}
移动m位,如下
void leftshift(char* s,int n,int m)
{
while(m--)
{
leftshiftone(s,n);
}
}
2.指针翻转法
abc def ghi->def abc ghi->def ghi abc
定义两个指针,p1指向ch[0],p2指向ch[m];
一下过程循环m次,交换p1和p2所指的元素,然后p1++,p2++;
1.第一步,交换abc和def,abc defghi->def abc ghi
2.第二步,交换abc和ghi,def abcghi->def ghiabc
程序设计,先循环m次,交换abc,def,之后判断p2+m-1.
#include<iostream>
void rotate(string &str,int m)
{
if(str.length()==0||m<=0)
return;
int n=str.length();
if(m%n<=0)
return ;
int p1=0,p2=m;
int k=(n-m)-n%m;
while(k--)
{
swap(str[p1],str[p2])
p1++;
p2++;
}
int r=n-p2;
while(r--)
{
int i=p2;
while(i>p1)
{
swap(str[i],str[i-1]);
i--;
}
p2++;
p1++;
}
思路3,递归转换
}