字串迴圈右移 c語言

2021-07-30 09:12:30 字數 1823 閱讀 3799

乙個長度為len的字串,對其迴圈右移n位

[期望]

char str = "abcdefg";

右移3次後,變成"efgabcd"

[思路]

思路1.

如果用每移動一次,就要把整個字串整體移動一次的方法,顯得太費勁了。

我們可以用空間換時間,通過記憶體拷貝來實現。

需要新申請一塊相同大小的記憶體,把原字串的後n個位元組拷貝到它的開始位址,把原字串的前(len-n)個位元組拷貝到它的(開始位址+n)處。

為便於檢視結果,我們先定義乙個列印字串的函式void print_str(char *str);

void print_str(char *str)

len =strlen(str);

for(i=0; i)

printf("\n

");}

print_str

思路1的**實現:

#include #include 

#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()

view code

思路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)

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()

view code

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...