将一个含有n个元素的数组向右循环移动k位,要求时间复杂度是O(n),且只能使用两个额外的变量.
分析:比如数组 1 2 3 4循环右移1位 将变成 4 1 2 3, 观察可知1 2 3 的顺序在移位前后没有改变,只是和4的位置交换了一下,所以等同于1 2 3 4 先划分为两部分1 2 3 | 4,然后将1 2 3逆序,再将4 逆序 得到 3 2 1 4,最后整体逆序 得到 4 1 2 3
很久没用c++了,有时候写算法还是用用c++,也随便练习一下。
#include <iostream>
void Reverse( int buffer[], int start, int end )
{
while ( start < end )
{
int temp = buffer[ start ] ;
buffer[ start++ ] = buffer[ end ] ;
buffer[ end-- ] = temp ;
}
}
void Shift( int buffer[], int n, int k )
{
k %= n ;
Reverse( buffer, 0, n - k - 1) ;
Reverse( buffer, n - k, n - 1 ) ;
Reverse( buffer, 0, n - 1 ) ;
}
int main(int argc, const char * argv[]) {
// insert code here...
int buffer [6] = {1, 2, 3, 4, 5, 6};
for(int i = 0; i < 6; i ++)
std::cout << buffer[i];
Shift(buffer, 6, 2);
std::cout << std::endl;
for(int i = 0; i < 6; i ++)
std::cout << buffer[i];
std::cout << std::endl;
return 0;
}
123456
561234
Program ended with exit code: 0