题目要求:
将字符串str进行循环移位,要求算法空间复杂度O(1),时间复杂度O(n)
思路:
假设str需要循环移位k位,则将其分为前后两部分,分别长k和n-k,称AB
则循环移位的过程即为XY->YX. 可由XT即转置完成,(XTYT)T=(YT)T(XT)T=YX
abcdefgh→(abcd)(efgh)→(dcba)(hgfe)→(dcbahgfe)→(efghabcd)
实现如下:
#include <string>
#include <iostream>
using namespace std;
void reverse(string& str,int k,int n)
{
char temp;
while (k<n)
{
temp=str[k];
str[k]=str[n];
str[n]=temp;
k++;
n--;
}
}
void reverseAll(string& str, int k,int n )
{
if (k>0&&n>0)
{
reverse(str,0,k-1);
reverse(str,k,n-1);
reverse(str,0,n-1);
cout<<str<<endl;
}
}
int main()
{
int k,n;
string inStr;
while(1)
{
cout<<"string:";
cin>>inStr;
cout<<endl;
cout<<"k:";
cin>>k;
cout<<endl;
if(!inStr.empty())
{
n=inStr.size();
if (k>n)
{
k%=n;
}
reverseAll(inStr,k,n);
}
}
}
编程珠玑第二章2.3讲到了这种方法,称为求逆算法
在书里用来求解
abcdefgh→defghabc
同样采用本方法:
abcdefgh→(abc) (defgh)→(cba) (hgfed)→(cbah gfed)→(defg habc)
习题5又提出如何将abc→cba
分成三部分
R(R(a)R(b)R(c)) = cba 其中R()就是逆操作
辉爷在讲位图排序时降到了一种使用位操作进行移位的方法,
但是:1.只能对正数或无符号数进行操作 2.与题设要求不太吻合,需要额外空间,而且不能对字符穿操作
但是想法很好,辉爷的PPt确实是好东西