循环移位

来源:互联网 发布:轩辕世界神兽数据 编辑:程序博客网 时间:2024/05/02 01:40

题目要求:

将字符串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 exceptionif (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 exceptionif (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);}}




原创粉丝点击