演算法題002 程式設計師程式設計藝術第一章 左旋轉字串

2021-09-06 08:30:20 字數 1260 閱讀 3331

定義字串的左旋轉操作:把字串前面的若干個(k個)字元移動到字串的尾部。

如把字串abcdef左旋轉2位得到字串cdefab。

請實現字串左旋轉的函式,要求對長度為n的字串操作的時間複雜度為o(n),空間複雜度為o(1)

如果採用每次將陣列中的元素移動一位,迴圈k次的方法,則時間複雜度為o(k * n),只需要額外的乙個儲存空間。但是這是不合時間複雜度要求的。

另外需要注意的是k不一定會小於n,所以需要取k = k % n。

但是這還是不能實現線性複雜度,程式設計之美上通過右移字串提出了乙個三次翻轉的演算法。

可以看到不管是左移還是右移,其結果都是兩段子串交換了位置。

如123abcd這個串,左移三位得到abcd123,實際上是123和abcd交換了位置。

首先,將123翻轉成逆序:321abcd

然後,將abcd翻轉成逆序:321dcba

最後,將整個串再翻轉一遍:abcd123(得到左移結果)。

通常情況的描述:

1.根據要移動的位數把字串劃分成兩段:xy;

2.翻轉x子段;

3.翻轉y子段;

4.將得到的結果整個翻轉。

#include #include 

using

namespace

std;

void reversestring(string &str)

//cout

int main(int argc, char*argv)

return0;

}

因為沒找到online judge,所以自己設計的測試用例:

輸入:

1234567abdcd 3

123 6

abcd 25

1234567 0

g 10

輸出

the final result is: 4567abdcd123

the final result is: 123

the final result is: bcda

the final result is: 1234567

the final result is: g

程式設計師程式設計藝術第一~二十七章集錦與總結

程式設計師程式設計藝術第一章 左旋轉字串

搜尋到的實現:

程式設計師程式設計藝術總結

第一章 左旋轉字串 第二章 字串是否包含及匹配 查詢 轉換 拷貝問題 第三章 尋找最小的k個數 第三章續 top k演算法問題的實現 第三章再續 快速選擇select演算法的深入分析與實現 第三章三續 求陣列中給定下標區間內的第k小 大 元素 第四章 現場編寫類似strstr strcpy strp...

程式設計師程式設計藝術 回文判斷

鳴謝 感謝 july,您的部落格給予我很大的幫助,增強了我學習的動力。希望分享的力量永傳!本文問題源於 july的文章,修正了 july關於回文 的bug,現將本人 發布如下 如發現有問題,還希望不吝賜教。謝謝。include include using namespace std int max ...

程式設計師程式設計藝術第一 十章集錦與總結

程式設計師程式設計藝術第一 十章集錦與總結 面試 演算法 程式設計 紅黑樹系列,及十三個經典演算法研究系列相比,程式設計藝術系列的作者已經不止我乙個人,而是乙個工作室了,它的名字叫做程式設計藝術室。程式設計藝術系列最初名為程式設計師面試題狂想曲,即為面試服務,後來隨著加入與我一起創作的人越來越多,我...