给出一个字符序列S,求对S向左(右)循环移动i后的字符序列。
比如:S = abcdefg, i = 3, 则操作完成后S = defgabc (向右同理哦)
技巧:假如S = abcdefg, i = 3, 那么可以进行如下操作:
1) 对S的前i个字符进行翻转, 对于上例,则可以得到 abc => cba
2) 对S中i以后的字符进行翻转,那么可以得到 defg => gfed
3) 经过以上两步后,S = cbagfed, 最后对S整体翻转,可到 cbagfed => defgabc
#include <stdio.h>
#include <string.h>
#define MAX_N 505
char str[MAX_N];
int i;
void toRev(char* str, int s, int e) {
char* left = str + s;
char* right = str + e;
char c;
while (left < right) {
c = *right;
*right-- = *left;
*left++ = c;
}
}
int main() {
int len;
while (scanf("%s%d", str, &i) != EOF) {
len = strlen(str);
i = i % len;
// 三次翻转
toRev(str, 0, i - 1);
toRev(str, i, len - 1);
toRev(str, 0, len - 1);
printf("%s\n", str);
}
return 0;
}
向右循环移动的方法也类似。