字串面試題系列之三 左旋轉字串

2021-06-17 19:30:40 字數 1834 閱讀 6991

在這裡說明一下,本系列文章所提供的演算法均在federa 8 系統上編譯通過並且編譯通過。如果有問題或者紕漏或者有好的建議更或者有更好的演算法,請不吝賜教。言歸正傳,這是字串的第三個演算法叫左旋字串。
左旋字串,咋一看也許不 太明白是什麼意思。其實有點類似於迴圈左移的概念。字串的第乙個字元移動到字串末尾,就像乙個環一樣。比如abc,左旋一位便是bca。解釋就到這裡。下面給出題目:
【題目】定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。

【例子】字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。

要求時間對長度為

n的字串操作的複雜度為

o(n)

,輔助記憶體為

o(1)

【分析】對於這一道題來講,我們應該如何來思考呢?直觀的想,顯然是開闢一塊相同的記憶體,然後將左旋的幾位數字複製到新開闢的陣列後面,然後依次將剩下的字元複製到新陣列裡。返回新陣列。

但是,這裡要求輔助記憶體是o(1), 也就是說,我們只能不能按照上面的方法去求。那又如何呢?
不知道小夥伴們是否還記得系列之一的顛倒字串,好吧,其實本題可以借助這樣一種思路來達到目的。因為採用的是交換的方式。所以符合記憶體要求。我們來如何做呢?
基於這個想法,我們就有了初步的演算法思路了。接下來我就就一步一步來寫下這個演算法的過程。
第一步:對整個字串逆轉;
第二步:分別逆轉兩個子字串(兩個子字串是題目告訴我們的,就是基於左旋多少位來計算的,這個很簡單吧);
第三步:我們完成得到的目標字串了。
基於上面的文字思路基礎上,我們寫下如下的code:
#include #include char * string_levorotation( char * const string, int pos, int length )

// reverse substring from 0 to pos-1

while( start < end )

// reverse substring from pos to the last

start = pos;

end = length - 1;

while( start < end )

// reverse the whole string

start = 0;

end = length - 1;

while( start < end )

return string;

}int main( int argc, char ** argv )

我們輸入字串

abcdef,得到的結果如下:

面試題42 左旋轉字串

題目 定義乙個函式實現字串左旋轉操作的功能。字串的左旋轉操作就是把字串前面的若干個字元轉移到字串的 尾部。比如輸入字串 abcdefg 和2,該函式將返回左旋轉2位得到的結果 cdefgab include include using namespace std 翻轉字串 void reverse ...

面試題58 題目二 左旋轉字串

面試題58 題目二 左旋轉字串 題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串 abcdefg 左旋轉2 位得到字串 cdefgab。思路 反轉三次字串 以 abcdefg 為例,我們可以把它分為 2部分。先分別翻轉這兩部分,於是就得到 bagfedc 接下來翻轉整個字...

面試題58 ii 左旋轉字串

題目 字串的左旋轉操作是把字串前面的若干個字元轉移到字串的尾部。請定義乙個函式實現字串左旋轉操作的功能。比如,輸入字串 abcdefg 和數字2,該函式將返回左旋轉兩位得到的結果 cdefgab 示例 示例 1 輸入 s abcdefg k 2 輸出 cdefgab 示例 2 輸入 s lrlose...