乙個長度為len的字串,對其迴圈右移n位
[期望]
char str = "abcdefg";
右移3次後,變成"efgabcd"
[思路]
思路1.
如果用每移動一次,就要把整個字串整體移動一次的方法,顯得太費勁了。
我們可以用空間換時間,通過記憶體拷貝來實現。
需要新申請一塊相同大小的記憶體,把原字串的後n個位元組拷貝到它的開始位址,把原字串的前(len-n)個位元組拷貝到它的(開始位址+n)處。
為便於檢視結果,我們先定義乙個列印字串的函式void print_str(char *str);
void print_str(char *str)print_strlen =strlen(str);
for(i=0; i)
printf("\n
");}
思路1的**實現:
#include #includeview code#include
void print_str(char *str)
len =strlen(str);
for(i=0; i)
printf("\n
");}int str_rshift_1(char *str, int
n)
tmp = (char *)malloc(len);
if (tmp ==null)
memcpy(tmp, str+len-n, n);
memcpy(tmp+n, str, len-n);
memcpy(str, tmp, len);
free(tmp);
str[len] = '\0'
;
return0;
}void
str_rshift_1_test()
void
main()
思路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, intview coden)
str_reverse(str,
0, len-n-1
); str_reverse(str, len-n, len-1
); str_reverse(str,
0, len-1
);
return0;
}void
str_rshift_2_test()
void
main()
C語言 字串迴圈右移
編寫乙個程式,作用是把乙個字串從末尾開始迴圈右移n個,如 abcdef n 3,則輸出 defabc 12345 n 2,則輸出 45123 思路 用迴圈,每次都把最後乙個字元元素挪到首元素的位子,其餘元素位子後移乙個,共n次。void main printf s a 總結 主要是迴圈,while迴...
字串迴圈右移 c語言
乙個長度為len的字串,對其迴圈右移n位 期望 char str abcdefg 右移3次後,變成 efgabcd 思路 思路1.如果用每移動一次,就要把整個字串整體移動一次的方法,顯得太費勁了。我們可以用空間換時間,通過記憶體拷貝來實現。需要新申請一塊相同大小的記憶體,把原字串的後n個位元組拷貝到...
字串迴圈右移
題目內容 輸入乙個字串和乙個非負整數 n,要求將字串迴圈右移n次。輸入格式 輸入在第 1行中給出乙個字串,以 表示結束,不是字串的一部分,字串的長度未知,但至少有乙個字元 輸入的第 2行給出非負整數n。輸出格式 在一行中輸出迴圈右移 n次後的字串。輸入樣例 hello world 2輸出樣例 d h...