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