经典的三次翻转:
1.先翻转字符串前n个字符;
2.再翻转后面的字符;
3.翻转整个字符串;
比如:输入字符串s="12345abc",n=5;
首先翻转前5个字符变成54321abc,然后翻转后面的字符变成54321cba,最后翻转整个字符串变成abc12345。
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <assert.h>
/*经典算法*/
void reverse(char *left, char *right)//翻转整个字符串
{
assert(left != NULL && right != NULL);
while (left < right) {
*left ^= *right;
*right ^= *left;
*left ^= *right;
left++, right--;
}
}
char *_move_steps(char *msg, int steps)
{
assert(msg != NULL);
int len = strlen(msg);
steps = steps % len;
reverse(msg, msg + steps - 1);
reverse(msg + steps, msg + len - 1);
reverse(msg, msg + len - 1);
return msg;
}
int main()
{
char p[] = "12345abc";
_move_steps(p, 5);
printf("%s\n", p);
system("pause");
return 0;
}