將N個字元的陣列,迴圈右移K位。時間複雜度O(N)。
阿新 • • 發佈:2019-02-07
將N個字元的陣列,迴圈右移K位。時間複雜度O(N)
eg:str[]=”abcde123”,右移3位
1、旋轉abcde->edcba
2、旋轉123->321
3、整體旋轉edcba321->123abcde
程式碼塊實現
void Reverse(char* str, int left,int right)
{
while (left < right)
{
std::swap(str[left], str[right]);
++left;
--right;
}
}
//這裡是迴圈右移K位,迴圈左移K位是同樣的道理
void RightMoveK(char* str,int size,int k)
{
assert(str);
k = k % size;//(這一步非常關鍵)因為右移size長度又回到了原來的字串
//翻轉前K個字元
Reverse(str, 0, size - k - 1);
//翻轉後面的剩餘字元
Reverse(str, size - k, size - 1);
//在進行整體翻轉
Reverse(str, 0, size - 1);
}
void RightMoveTest()
{
char str[] = "abcde123" ;
int len = strlen(str);
cout << "原str: "<<str << endl;
RightMoveK(str, len, 6);
cout << "右移K位的str: " << str << endl;
}