題目描述:
定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部,如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。
指標翻轉法
咱們先來看個例子,如下:abc defghi,若要讓abc移動至最後的過程可以是:abc defghi->def abcghi->def ghiabc
如此,我們可定義倆指標,p1指向ch[0],p2指向ch[m];
一下過程迴圈m次,交換p1和p2所指元素,然後p1++, p2++;。
第一步,交換abc 和def ,abc defghi->def abcghi
第二步,交換abc 和 ghi,def abcghi->def ghiabc
整個過程,看起來,就是abc 一步一步 向後移動
//最後的 複雜度是o(m+n)
**如下:
由上述例子九個元素的序列abcdefghi,您已經看到,m=3時,p2恰好指到了陣列最後乙個元素,於是,上述思路沒有問題。但如果上面例子中i 的後面還有元素列?
即,如果是要左旋十個元素的序列:abcdefghij,ok,下面,就舉這個例子,對abcdefghij序列進行左旋轉操作:
如果abcdef ghij要變成defghij abc:
abcdef ghij
1. def abc ghij
2. def ghi abc j //接下來,j 步步前移
3. def ghi ab jc
4. def ghi a j bc
5. def ghi j abc
下面,再針對上述過程,畫個圖清晰說明下,如下所示:
ok,咱們來好好徹底總結一下此思路二:
(就4點,請仔細閱讀):
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++;
////最終**,july,updated again,2011.04.17。
#include #include
using
namespace
std;
void rotate(string &str, int
m)
//重點,都在下述幾行。
//處理尾部,r為尾部左移次數
int r = n -p2;
while (r--)
p2++;
p1++;
}
//比如乙個例子,abcdefghijk
//p1 p2
//當執行到這裡時,defghi a b c j k
//p2+m出界 了,
//r=n-p2=2,所以以下過程,要執行迴圈倆次。
//第一次:j 步步前移,abcjk->abjck->ajbck->jabck
//然後,p1++,p2++,p1指a,p2指k。
//p1 p2
//第二次:defghi j a b c k
//同理,此後,k步步前移,abck->abkc->akbc->kabc。
}
intmain()
左旋轉字串
題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 思想 旋轉三次 include include using namespace std v...
左旋轉字串
package com.string 旋轉字串 q 26 左旋轉字串 題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 public cla...
左旋轉字串
如abc,左旋1得到bca,左旋2得到cab o n k 的演算法 include using namespace std include include include include include include include include include include int main...