微軟面試100題 左旋字串

2021-07-22 09:33:12 字數 1936 閱讀 3637

定義字串的左旋操作:將字串前面的若干個字元移動到字串的尾部;如」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 相當於只能進行字串中字元的替換操作,如果...