编程珠玑第二章 左旋数组i个长度 空间复杂度为常数
#include "head.h"
//这个方法不对,左边i到右边之后可能会乱序
class Solution{
public:
void rotate_i(vector<int> &vec, int i)
{
int t = 0;
for (int j=0;j<i;j++)
{
int k=1;
t = vec[j];
for(;k*i + j<vec.size();k++)
{
cout<<"exchange : "<<(k-1)*i + j<<" "<<k*i + j<<endl;
vec[(k-1)*i + j] = vec[k*i + j];
}
cout<<"exchange : "<<(k-1)*i + j<<" "<<j<<endl;
vec[(k-1)*i + j] = t;
}
}
};
/*n = vec.size(), k = n 和i的最大公约数
j in [0,k) m=j:
t = vec[j]
vec[(m + (N-1)*i)/n] = vec[(m + N*i)/n] N = 1,2,3...
直到m + N*i)/n == j:
vec[(m + (N-1)*i)/n] = t
*/
/*
n*x = i*y
x = (i*y)/x,x为需要经过x个循环回到初始点,y为一个循环中已经交换点的个数
若最大公约数数k为1,x=i,y=n,只需要一次循环
若最大公约数k>1,x=i/k,y=n/n,需要循环k次
*/
class Solution1{
public:
void rotate_i(vector<int> &vec, int i)
{
int n = vec.size();
int g = gcd(n,i);
cout<<g<<endl;
for (int j=0;j<g;j++)
{
int k = 0;
int t = vec[j];
for (k = j + i;k%n != j;k+=i)
{
vec[(k-i)%n] = vec[k%n];
}
vec[(k-i)%n] = t;
}
}
int gcd(int i, int j)
{
while(i != j)
{
if (i>j)
i -= j;
else
j -= i;
}
return i;
}
};
int main()
{
int A[] = {1,2,3,4,5,6,7,8,9,10,11};
vector<int> vec(A,A+9);
Solution1 s;
s.rotate_i(vec, 3);
print1Dvectorint(vec);
}