字串的旋轉 (增改版)

2022-02-18 00:42:49 字數 1883 閱讀 8345

更多方法:

題目描述:給定乙個字串,要求將字串前面的若干個字元移動到字串的尾部。例如,將字串"abcdef"的前3個字元'a'、'b'、'c'移動到字串的尾部,那麼原字串將變成"defabc"。請寫乙個函式實現此功能。

方法一:蠻力移位

定義指向字串的指標s,設字串長度為n,首先實現leftshiftone(char *s ,int n)將乙個字元移動到字串的最後,然後呼叫m次實現將m個字元移動到字串末尾

#include using

namespace

std;

void leftshiftone( char* s , int

n ) s[n-1] =t;

}void leftrotatestring( char* s , int n , int

m )}

intmain()

gcc執行結果:

方法二:三步翻轉

拿上面的例子來說明:

(1)將原來的字元劃分為兩個部分a和b(劃分依據為所移動m個字元);

(2)將子字串a和b進行翻轉操作;  分別為:"abc"--->"cba"  "def"--->"fed"

(3)最後將整體字串進行翻轉操作,從而實現題目要求的字串翻轉.  過程為: "cbafed"--->"defabc"

#include using

namespace

std;

void reversestring( char *s , int

from , int

to )

}void leftrotatestring( char *s , int n , int

m )int

main()

gcc執行結果:

下面,再針對上述過程,畫個圖清晰說明下,如下所示:

解題思路:

1、首先讓p1=ch[0],p2=ch[m],即讓p1,p2相隔m的距離;

2、判斷p2+m-1是否越界,如果沒有越界轉到3,否則轉到4(abcdefgh這8個字母的字串,以4左旋,那麼初始時p2指向e,p2+4越界了,但事實上p2至p2+m-1是m個字元,可以再做乙個交換)。

3、不斷交換*p1與*p2,然後p1++,p2++,迴圈m次,然後轉到2。

4、此時p2+m-1 已經越界,在此只需處理尾巴。過程如下:

4.1 通過n-p2得到p2與尾部之間元素個數r,即我們要前移的元素個數。

4.2 以下過程執行r次:

ch[p2]ch[p2-1],ch[p2-1]ch[p2-2],....,ch[p1+1]ch[p1];p1++;p2++;

#includeusing

namespace

std;

void removestring(char *s, int

m)

int r = len -p2;

while (r--)

p2++;

p1++;

}}int

main()

gcc執行結果:

字串 字串的旋轉

時間複雜度為o m n 空間複雜度為o 1 include include include void leftshiftone char str,int n void leftrotatestring char str,int n,int m int main 輸出 before rotate ab...

字串旋轉

問題 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef前2位字元移到後面得到字串cdefab。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 看到大多數的帖子都是進行三次旋轉 如 個人感覺這思路確實比較新穎,但是總感覺有點麻煩了,個人思路如下 include inclu...

字串旋轉

字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。例如 aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 同理字串右旋操作 aabcd右旋乙個字元得到daabc aabcd右旋兩個字元得到cdaab 那麼今天就來說一下字串旋轉中的一些問題 首先說一下簡單的,先用函式...