問題描述
將n個字元的陣列,迴圈右移k位。時間複雜度o(n)。
比如原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位。
問題分析
方法1、暴力位移法,時間複雜度為o(m*n)
下面是左旋的方法,
void leftshift1(char *str,size_t len, size_t n)
str[len - 1] = tmp;
}}
方法2、指標翻轉法,時間複雜度為o(m+n)
就是以n個字元為單位,進行移動,當剩餘元素不夠k個元素時,1個1個進行移動。
void leftshift2(string &str, size_t n)
//末尾留有位置
int r = len - p2;
while (r--)
p1++;
p2++;
}}
方法3、時間複雜度為o(n)
(1)思路1、
就是將原陣列,分為兩個部分,分別將這兩個部分逆序,然後再將逆序後字串,再進行逆序
步驟:1.逆序排列 abcd: abcd1234 -> dcba1234;
2.逆序排列 1234: dcba1234-> dcba4321;
3.全部逆序 dcba4321->1234abcd。
//方法4、就是將字串分為兩個部分,分別逆序,然後再將整體逆序
void reversestr(char *str, int begin, int end)
void rightshift4(char *str,int len,int n)
(2)思路2:
方法簡單到爆,重新開闢同樣的空間大小,將原陣列中的內容,按旋轉之後的順序放置。
void rightshift3(string &str,size_t n)
str = temp;
}
左旋右旋字串
定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef 左旋轉2 位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 分析 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部...
字串左旋右旋問題
如把字串abcdef 左旋轉2 位得到字串cdefab。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 分析 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,通過旋轉操作把這兩個部分交換位置。於是我們可以新開闢一塊長度為n 1 的輔助空間,...
左旋轉字串(字串)
題目描述 組合語言中有一種移位指令叫做迴圈左移 rol 現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s abcxyzdef 要求輸出迴圈左移3位後的結果,即 xyzdefabc 是不是很簡單?ok,搞定它!思路一 pub...