1. 程式人生 > >將N個字元的陣列,迴圈右移K位。時間複雜度O(N)。

將N個字元的陣列,迴圈右移K位。時間複雜度O(N)。

將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; }

結果展示

這裡寫圖片描述