給定一個字符串,要求將字符串前面的若干個字符轉移到字符串的尾部,例如:將「abcdef」的前3個字符‘a、’b‘、’c‘移到字符串的尾部。this
解法一:蠻力移位blog
#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」爲例string
1)將元字符串分爲X和Y兩個部分,X爲」abc「,Y爲」def「io
2)將X的全部字符反轉,即至關於反轉」abc「獲得」cba「,再將Y的全部字符也反轉,將」def「反轉爲」fed「class
3)最後將以上獲得的結果再總體反轉,即」cbafed「獲得」defabc「gc
#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); }