打算好好学算法,从模仿开始,我现在写的算法都是看了别人的原理然后自己实现的。积累实在太少,很多问题想不到最优的解决方案,不过以后会好起来的。
字符串的循环移位(左移和右移原理一样)原理:
如字符串1234abcd,右移4位,实现如下
1234abcd→4321abcd→4321dcba→abcd234
即先反转前4个字符,再反转后4个,再全部反转。
/*
*
2013.7.23
DVD0423
function:字符串循环移位
功能描述:
定义字符串循环右移操作:把一个长度为N的字符串内的元素
循环右移K位,要求时间复杂度为O(N),空间复杂度为O(1),
输入样例:
N=8的字符串abcdefgh;
输出样例:
K=4,即字符元素右移4位,得到efghabcd。
*
*/
#include <iostream>
#include <string>
using namespace std;
void invertString(string &strN, int start, int end)
{
int length = end - start;
for(int i = 0; i < length/2; ++i)
{
char temp;
temp = strN[end-1-i];
strN[end-1-i] = strN[start+i];
strN[start+i] = temp;
}
}
void rightShift(string &strN, int K)
{
int N= strN.length();
invertString(strN, 0, N-K);
invertString(strN, N-K, N);
invertString(strN, 0,N);
}
int main(int argc, char *argv[])
{
string strN;
int K= 0;
cout<<"Input :\t( string, K)\n"<<endl;
cin>>strN>>K;
rightShift( strN, K);
cout<<"Output :\n"
<<strN<<endl;
return 0;
}