题目要求:
将字符串str进行循环移位,要求算法空间复杂度O(1),时间复杂度O(n)
思路:
假设str需要循环移位k位,则将其分为前后两部分,分别长k和n-k,称AB
则循环移位的过程即为XY->YX. 可由XT即转置完成,(XTYT)T=(YT)T(XT)T=YX
实现如下:
#include"stdio.h"
#include"string.h"
void ReverseString(char* str, unsigned int nStart, unsigned int nEnd)
{
char tmp;
while(nStart < nEnd)
{
tmp = str[nStart];
str[nStart] = str[nEnd];
str[nEnd] = tmp;
++ nStart;
-- nEnd;
}
}
void RightReverse(char* str, unsigned int nBit, unsigned int nLen)
{
//avoid exception
if (nBit > 0 && nLen > 0)
{
ReverseString(str, 0, nLen - 1);
ReverseString(str, 0, nBit - 1);
ReverseString(str, nBit, nLen - 1);
}
}
void LeftReverse(char* str, unsigned int nBit, unsigned int nLen)
{
//avoid exception
if (nBit > 0 && nLen > 0)
{
ReverseString(str, 0, nBit - 1);
ReverseString(str, nBit, nLen - 1);
ReverseString(str, 0, nLen - 1);
}
}
int main()
{
const int MAXLEN = 64;
char str[MAXLEN] = {0};
unsigned int kBit, len;
printf("Please input the string and start from the bit:");
while (scanf("%s%d", str, &kBit) != EOF)
{
len = strlen(str);
if (kBit > len)
kBit %= len;
RightReverse(str, kBit, len);
LeftReverse(str, kBit, len);
printf("%s\n",str);
}
}