定義字串的左旋操作:將字串前面的若干個字元移動到字串的尾部;如」abcde「左旋2位–》」cdeab「
思路:ab–>ba
cde–>edc
baedc–>cdeab
分3部分反轉
**:
public
static
void leftstr_1(stringbuilder str,int k)
private
static
void
reverse(stringbuilder str,int start,int end)
}
思路:使用2個指標逐步翻轉。
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 一步一步 向後移動
abc defghi
def abcghi
def ghi abc
如果是要左旋十個元素的序列: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
下面,再針對上述過程,畫個圖清晰說明下,如下所示:
總的過程:
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次
將p2與前乙個交換;直到交換到p1;
**實現:
public
static
void leftstr_2(stringbuilder str,int k)
if(k%n==0)
int p1=0,p2=k;
int m=n-k-n%k;
while(m!=0)
int r=n-p2;
while(r!=0)
str.setcharat(i, ch);
r--;
p2++;
p1++;
}
system.out.println(str);
}
遞迴,方法2思路相同,是不過通過遞迴實現;
設原始問題為:將「123abcdefg」左旋轉為「abcdefg123」,即總長度為10,旋轉部(「123」)長度為3的左旋轉。
按照思路二的運算,演變過程為「123abcdefg」->」abc123defg」->」abcdef123g」。這時,」123」無法和」g」作對調,該問題遞迴轉化為:將「123g」右旋轉為」g123」,即總長度為4,旋轉部(「g」)長度為1的右旋轉。
微軟100題 26 左旋轉字串
題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 分析一 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩...
微軟演算法100題26 左旋轉字串
26.左旋轉字串 題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef 左旋轉2 位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 思路 先反轉整個字串 fedcba 在分別反轉各個子字串 fedc...
微軟演算法面試 19 左旋字串
題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。例如把字串 abcdef 左旋2位 得到字串 cdefab 請實現字串左旋轉的函式。要求時間對長度n的字串操作的複雜度位o n 輔助記憶體為o 1 分析 這題的難點是輔助記憶體只能只用o 1 相當於只能進行字串中字元的替換操作,如果...