更多方法:
題目描述:給定乙個字串,要求將字串前面的若干個字元移動到字串的尾部。例如,將字串"abcdef"的前3個字元'a'、'b'、'c'移動到字串的尾部,那麼原字串將變成"defabc"。請寫乙個函式實現此功能。
方法一:蠻力移位
定義指向字串的指標s,設字串長度為n,首先實現leftshiftone(char *s ,int n)將乙個字元移動到字串的最後,然後呼叫m次實現將m個字元移動到字串末尾
#include usinggcc執行結果:namespace
std;
void leftshiftone( char* s , int
n ) s[n-1] =t;
}void leftrotatestring( char* s , int n , int
m )}
intmain()
方法二:三步翻轉
拿上面的例子來說明:
(1)將原來的字元劃分為兩個部分a和b(劃分依據為所移動m個字元);
(2)將子字串a和b進行翻轉操作; 分別為:"abc"--->"cba" "def"--->"fed"
(3)最後將整體字串進行翻轉操作,從而實現題目要求的字串翻轉. 過程為: "cbafed"--->"defabc"
#include usinggcc執行結果:namespace
std;
void reversestring( char *s , int
from , int
to )
}void leftrotatestring( char *s , int n , int
m )int
main()
下面,再針對上述過程,畫個圖清晰說明下,如下所示:
解題思路:
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++;
#includeusinggcc執行結果:namespace
std;
void removestring(char *s, int
m)
int r = len -p2;
while (r--)
p2++;
p1++;
}}int
main()
字串 字串的旋轉
時間複雜度為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 那麼今天就來說一下字串旋轉中的一些問題 首先說一下簡單的,先用函式...