鏈表、隊列、棧和字符串的相關應用(三)字符串的旋轉

知識點:字符串

題目:

對於一個字符串,和字符串中的某一位置,請設計一個算法,將包括i位置在內的左側部分移動到右邊,將右側部分移動到左邊。

給定字符串A和它的長度n以及特定位置p,請返回旋轉後的結果。

測試樣例:
"ABCDEFGH",8,4
返回:"FGHABCDE"
思路:以特定位置爲轉折點,分別進行兩次旋轉(分部旋轉和整體旋轉)
初始:ABCDEFGH  最終:FGH ABCDE
考慮整體旋轉:HGF EDCBA  與最終相差的就是前後兩個部分的再次旋轉
所以,可以先部分旋轉,再整體旋轉,或者先整體旋轉再部分旋轉 
本文采用先部分後整體;
代碼如下:
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        // write code here
        int i1 = 0;
        int j1 = p;
        while(i1 < j1)
           swap(A[i1++],A[j1--]);
        int i2 = p+1;
        int j2 = n-1;
        while(i2 < j2)
            swap(A[i2++], A[j2--]);
        int i3 = 0;
        int j3 = n-1;
        while(i3 < j3)
            swap(A[i3++], A[j3--]);
        return A;
        
    }
};

這種寫法有點複雜,可以考慮reverse 
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        // write code here
        reverse(A.begin(), A.begin()+p+1); //末尾要多加一位
        reverse(A.begin()+p+1, A.end());
        reverse(A.begin(),A.end());
        return A;
        
    }
};
這種比較簡便,也更容易看出原理


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章