首先,先看看如何對數字進行迴圈移位
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,intn)
void right_shift(char* str,intn)
現在考慮需要額外空間的情況。
我們知道,反轉乙個字串操作("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...