字符串循環右移

字符串循環右移算法

碰到一些問題,需要對字符串進行循環右移幾位的操作,如果一位一位的整體移動,時間就耗費太多了;而如果使用輔助數組來臨時存儲一下,那麼空間耗費就大了。想了有點時間,找到一個O(n)時間,僅需兩個臨時字符變量的方法。適合較長字符串,較多移動間距的循環移位操作:
 
/* 字符串循環右移函數:
tmp1存儲前一個, tmp2 存儲下一個。start記錄起始位置設置它的原因是:如果某次循環之後正好回到了start,那麼令 start++, cur再指向它,從這個新位置開始循環移動。
*/
void MoveRight2(char* s, int len,  int k) {                //k 表示右移多少位
    k = k%len;
    if (k == 0) return;
 
    int i, cnt = 0;
    int cur = 0, start = 0, next;
    char tmp1 = s[0], tmp2;

    while (cnt < len) {
        next = (cur+k)%len;
        tmp2 = s[next];
        s[next] = tmp1;
        if(++cnt == len) break;
       
        if (next == start) {
            cur = ++start;
            tmp1 = s[cur];
        }    
        else {
            tmp1 = tmp2;
            cur = next;
        }    
    }           
}
發佈了20 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章