字串迴圈移位

2021-07-05 07:03:52 字數 1506 閱讀 3633

首先,先看看如何對數字進行迴圈移位

c語言中沒有提供迴圈移位的操作符,但可以通過簡潔的方式實現迴圈移位,主要使用移位操作來實現。

設乙個運算元x有s位則迴圈左移n位的操作為:

(x << n) | (x >> (s - n));

同理右移n位位:

(x >> n) | (x << (s - n));
實際程式設計中可以用巨集定義實現迴圈移位:

#define rotate_left(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))

#define rotate_right(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))

下面是乙個小的測試程式:

#define rotate_left(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))

#define rotate_right(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))

intmain()

輸出結果如下:

下面我就要討論一下怎麼實現字串的移位。

問題,給你乙個字串,要求迴圈左移n位

比如對"abcdefg" 迴圈左移2位,我們要得到"cdefgab"

附加條件,不能使用連續輔助空間(包括動態分配),只能使用若干單個變數(即o(1)空間)

如果,不限制空間的使用,我們可以按上面數字迴圈移位的方式來實現,具體如下:

迴圈左移

迴圈右移

void left_shift(char* str,int

n)

void right_shift(char* str,int

n)

現在考慮需要額外空間的情況。

我們知道,反轉乙個字串操作("abcd"變"dcba"),是不需要額外陣列輔助的,只要頭尾資料交換就可以了。

這兒我們利用多次反轉字串來進行字串的迴圈移動:

**如下:

#include #include 

//反轉字串,把st與ed所指向的中間的內容反轉(包含st不包含ed)

void str_rev(char* st, char *ed)

} //用三反轉等效左移字串(st與ed之間,包含st不包含ed的內容)

char* str_shl(char* st, char* ed, int

n)

char* str_shr(char* st, char* ed, int

n)

intmain()

結果如下:

注意:兩段分別反轉,最後再整體反轉,就實現了迴圈左移(如果先整體再兩部分,就是迴圈右移)

參考:

字串迴圈移位

把字串移動n位。可以乙個乙個移動,這樣的話,要移動n次,每次移動len個。演算法時間複雜度為o n len 也可以開闢乙個新的記憶體,把移動的最終位置計算出來,直接放到那裡即可,這樣時間負責度為o 1 空間複雜度為o len 除此之外,還有時間負責度為o 1 空間負責度也為o 1 的演算法。第一種方...

字串迴圈移位

問題描述 給定乙個字串,把字串前k個字元移動到尾部。例 字串 abcdefg 左移3為變成 defgabc 解決思路 引入矩陣中 a b ba的思想 a 為a的轉置矩陣 比如 abc cba,defg gfed,cbagfed defgabc。這樣的演算法時間複雜度是o n 空間複雜度是o 1 如下...

字串迴圈移位

請實現字串右迴圈移位函式,比如 abcdefgh 迴圈右移兩位就是 ghabcdef 實現字串迴圈移位可有多種方式 老實方法 乙個乙個的移位,每次迴圈,先把最後乙個儲存起來,然後從後面開始往後挪一位。如果移位k次,這個操作就進行k次迴圈 圖示內部移位一次流程 如下 void rightloopmov...