给定一个字符串,要求将字符串前面的若干个字符转移到字符串的尾部,例如:将“abcdef”的前3个字符‘a、’b‘、’c‘移到字符串的尾部。
解法一:蛮力移位
#include <stdio.h> #include <string.h> #include <stdlib.h> void left_shift_one(char *src, int n); void left_rotate_string(char *src, int n, int m); int main(int argc, char *argv[]) { char str[] = "this is left"; printf("before:\n"); printf("%s\n", str); left_rotate_string(str, strlen(str), 5); printf("after:\n"); printf("%s\n", str); return 0; } void left_shift_one(char *src, int n) { if (NULL == src) { return ; } char t = src[0]; for (int i = 1; i < n; ++i) { src[i - 1] = src[i]; } src[n - 1] = t; } void left_rotate_string(char *src, int n, int m) { if (NULL == src) { return ; } while (m--) { left_shift_one(src, n); } }
解法二:三部反转
以“abcdef”为例
1)将元字符串分为X和Y两个部分,X为”abc“,Y为”def“
2)将X的所有字符反转,即相当于反转”abc“得到”cba“,再将Y的所有字符也反转,将”def“反转为”fed“
3)最后将以上得到的结果再整体反转,即”cbafed“得到”defabc“
#include <stdio.h> #include <string.h> void reverse_string(char *src, int from, int to); void left_rotate_string(char *src, int n, int m); int main(int argc, char *argv[]) { char str[] = "abcdef"; int m = 3; printf("%s\n", str); left_rotate_string(str, strlen(str), m); printf("%s\n", str); return 0; } void reverse_string(char *src, int from, int to) { if (NULL == src) { return ; } while (from < to) { char tem = src[from]; src[from++] = src[to]; src[to--] = tem; } } void left_rotate_string(char *src, int n, int m) { if (NULL == src) { return ; } m %= n; reverse_string(src, 0, m - 1); reverse_string(src, m, n - 1); reverse_string(src, 0, n - 1); }