題目描述:字串的左轉操作:將字串前面的若干個字元移動到字串的尾部。
例如:把字串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 相當於乙個容器,包含了...