左旋轉字串

2021-09-06 12:33:19 字數 2194 閱讀 2827

題目描述

定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部,如把字串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...