知識點:字符串
題目:
對於一個字符串,和字符串中的某一位置,請設計一個算法,將包括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;
}
};
這種比較簡便,也更容易看出原理