首先說明下所謂"字串左右旋轉"是指什麼:
如字串"abcdefg"左旋2位,結果應該是"cdefgab";再對"cdefgab"右旋2位,結果應該是"abcdefg",即:
左旋n位:字串的前n位由首部移到尾部,右旋n位:字串的後n位由尾部移到首部。n < strlen(字串)
1、直觀的常規方法:
直觀方法就是依次移位,比如abcdefg,需要左旋2位,那麼先把a移位到尾部使字串變成bcdefga,然後再把b移位到尾部是字串變成cdefgab。
每個字元的一次直接移位的時間複雜度是o(n),如果需要移位n個字元,那麼時間複雜度就是o(n * strlen(字串))
2、o(n)的方法:
採取"先交換最後移位"的方式,依然以abcdefg左旋2位為例,先連續進行2次"交換",依次變為cdabefg、cdefabg,這時候長度已經不能再交換了,就對最後的abg進行移位變為gab,最終結果就是cdefgab。交換、移位的時間複雜度都是o(n),所以整個操作的時間複雜度也是o(strlen(字串)):
完整程式含測試程式如下:
#include #include //p[0: num-1]與p[num: num * 2 - 1]交換資料(o(n))
void swap (char *p, int num)
}//abcde變為eabcd(o(n))
void leftshift (char *p, int num)
p[0] = rightest;
}//abcde變為bcdea(o(n))
void rightshift (char *p, int num)
p[num] = leftest;
}//還能整塊交換的時候就整塊交換, 不能交換的時候就移位. rotate和shift的時間複雜度都是o(n), 所以整個操作也是o(n)的時間複雜度
void leftrotate (char *p, const char *q, int num) else
return; }}
void rightrotate (char *p, const char *q, int num) else }}
int main (int argc, char *argv)
C高階 字串左右旋轉
明確 字串左右旋轉 是指什麼?怎樣進行字串的旋轉?解題思路 最直接的方法就是依次移位處理 左旋n位 字串的前n位由首部移到尾部,右旋n位 字串的後n位由尾部移到首部。n strlen 字串 字串長度計算 len strlen str 字串左旋 寫乙個函式,可以實現字串左旋k個字元 舉例 abcd 左...
字串左右旋
點 技巧性問題 題意 如字串1234567890,希望旋轉為5678901234 常見面試題 思路 還是那句話,這類題,絕對是各種技巧去解決,遞迴 迴圈 雙向相遇 快慢指標 各種其他技巧。具體到本題,直接交換的話實現起來甚至還非常麻煩,比如5不能和1交換,因為最後兩個字元90怎麼辦,這種情況程式很難...
演算法練習篇之 左右旋轉字串
組合語言中有一種移位指令叫做迴圈左移 rol 現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s abcxyzdef 要求輸出迴圈左移3位後的結果,即 xyzdefabc 是不是很簡單?ok,搞定它!按照題目意思,相當於將乙...