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

2021-07-03 22:25:59 字數 1641 閱讀 4277

題目描述:字串的左轉操作:將字串前面的若干個字元移動到字串的尾部。

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

要求:要求對字串實現左旋轉操作,並且對長度為n的字串操作的時間複雜度為o(n),空間複雜度為o(1).

方法一、

我們可以講字串的左轉想成如下過程:假設左轉1個字元:

(1)、先把第乙個字元提取出來;

(2)、後續的字元依次往前進乙個;

(3)、完畢之後,把提取出來的第乙個字元加到最後。

**實現如下:

#include "leftmovechars.h"

void leftmovechars(char str);

int main()

void leftmovechars(char str)

str[5] = ch;

return;

}

執行結果如下圖:

完成了乙個字串的旋轉之後,假如要完成前n個字串,只需要對上述操作迴圈n次就行:

修改後的**如下:

修改leftmovechars為如下方法:

void leftmovechars_by_n(char str,int n)

得到的執行結果如下:

如此我們就完成了字串的左旋轉。

但是該方法有個缺點,被移動的字串都是乙個個的被移動,由於考慮題目特點,被移動的字串應當是整體的,可以被打包在一起整體移動的,所以我們可以採用下面的方法。

方法二、

主要思路如下:假設有7個長度的字串abcdef『\0』,左旋長度為3,那麼將abc繫結在一起,依次往後移動

實現上可以設定兩個指標p1、p2,分別指向第乙個字元和第m個字元,這裡的m是左旋長度

所以分別一一對應將兩個資料交換,然後p1和p2分別向後移動。這裡需要考慮兩個問題,長度是否正好是旋轉長度的整數倍,若不是,需要考慮p2指標移動長度不足的情況,此時只要把p2之後的資料和p1之後的資料有多少就交換多少就可以,而最後的'\0'不能被交換,否則系統會發生預設讀取'\0'之後的資料。

在最後不足長度的情況下做最後交換時,p1指標的最後乙個資料優於無法和'\0'做交換,所以需要p1內部排序,將p1開始之後的資料全部賽到已交換的p1資料之後。

函式**如下:

void leftmovechars_by_points(char str,int n)

printf("字串長度為:%d\n",length);

//先定義兩個指標,第乙個指標指向第乙個元素,第二個指標指向第n個元素;

char* p1 = &str[0];

char* p2 = &str[n];

char temp;

int mod = length % n;

int x = length / n;

if (0 == mod)

{ //從兩個指標所指的位置開始兩段長度為n的字串的一一對應交換

while ( x-- != 1)

{ for(int i = 0;i

驅動第一章字串

使用字串結構 傳統c語言總定義和使用字串 ansi和unicode ansi unicode char str ansi字串定義 wchar t wstr unicode字串定義 求長度 size t len strlen str ansi size t wlen wcslen wstr unico...

Scala程式設計實戰 第一章 字串 1

scala val s1 hello s1 string hello scala val s1 hello s1 string hello scala val s2 hello s2 string hello scala val s3 h ello s3 string hello scala s1 ...

Scala程式設計實戰 第一章 字串 2

val patternstr 正規表示式 r string.r方法可以建立乙個regex物件val match1 patternstr.findfirstin 待查詢string regex物件的findfirstin方法會找到第乙個匹配的,返回乙個option string 相當於乙個容器,包含了...