字串迴圈右移c實現
阿新 • • 發佈:2019-01-25
一個長度為len的字串,對其迴圈右移n位
[期望]
char str[] = "abcdefg";
右移3次後,變成"efgabcd"
[思路]
思路1.
如果用每移動一次,就要把整個字串整體移動一次的方法,顯得太費勁了。
我們可以用空間換時間,通過記憶體拷貝來實現。
需要新申請一塊相同大小的記憶體,把原字串的後n個位元組拷貝到它的開始地址,把原字串的前(len-n)個位元組拷貝到它的(開始地址+n)處。
為便於檢視結果,我們先定義一個列印字串的函式void print_str(char *str);
void print_str(char *str) { int i,len;if (str == NULL) { return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf("\n"); }
思路1的程式碼實現:
#include <stdio.h> #include <string.h> #include <stdlib.h> void print_str(char *str) { int i,len; if (str == NULL) {return; } len = strlen(str); for(i=0; i<len; i++) { printf("%c",str[i]); } printf("\n"); } int str_rshift_1(char *str, int n) { int len; char *tmp; len = strlen(str); if (len < n) { return 1; } tmp = (char *)malloc(len);if (tmp == NULL) { return 1; } memcpy(tmp, str+len-n, n); memcpy(tmp+n, str, len-n); memcpy(str, tmp, len); free(tmp); str[len] = '\0'; return 0; } void str_rshift_1_test() { char str[] = "abcdefg"; str_rshift_1(str, 3); print_str(str); } void main() { str_rshift_1_test(); }
思路2.
來自《程式設計珠璣》裡的演算法,利用字串的逆序來實現。
比如字串"abcdefg",要迴圈右移3位,那麼這個字串可以分為2部分:
前半部分:"abcd" 和後半部分 "efg"。
我們先把前半部分逆序變成 -> "dcba"
再把後半部分逆序變成-> "gfe"
這時整體字串應該是 "dcbagfe"
我們再對整個字串逆序一遍,結果-> "efgabcd"。
bingo,迴圈右移完成。
總結一下,總共要進行3次逆序:前半部分逆序,後半部分逆序,整體逆序。
逆序用到的函式原型是void str_reverse(char *str, int left, int right);它的實現在這裡。
思路2的程式碼實現:
int str_rshift_2(char *str, int n) { int len = strlen(str); if (len < n) { return 1; } str_reverse(str, 0, len-n-1); str_reverse(str, len-n, len-1); str_reverse(str, 0, len-1); return 0; } void str_rshift_2_test() { char str[] = "abcdefg"; str_rshift_2(str, 3); print_str(str); } void main() { str_rshift_2_test(); }