1.题目
假设有一个有 n 个元素的数组,求该数组右移 k 个元素后的数组,要求算法的空间复杂度为 O(1) 。
输入数据右三行,第一行表示数组元素个数 n ,第二行表示数组,第三行表示 k
7
1,2,3,4,5,6,7
3
输出
5,6,7,1,2,3,4
2.实现
分析:思路是,从最后一位开始,找到它要填的位置,再去寻找那个位置的数的新位置,重复直到找到某个数的新位置为最后一位。
#include<iostream>
using namespace std;
void moveArray(int arr[],int N,int k)
{
k=k%N;
//取当前变换的一位,从最后一位开始
int currentIndex=N-1,currentVal=arr[N-1];
do{
//取到要变换的位置
currentIndex=(currentIndex+k)%N;
//交换当前值
int temp=arr[currentIndex];
arr[currentIndex]=currentVal;
currentVal=temp;
}while(N-1!=currentIndex);
}
int main()
{
int N,i,k,p;
cin>>N;
int a[N];
for(i=0;i<N;i++)
cin>>a[i];
cin>>k;
p=k%N;
moveArray(a,N,k);
for(i=0;i<N;i++)
cout<<a[i]<<" ";
return 0;
}
实现的另一种方法(但是空间复杂度不满足了)
#include<iostream>
using namespace std;
int main()
{
int N,i,k;
cin>>N;
int a[N],b[N];
for(i=0;i<N;i++)
cin>>a[i];
cin>>k;
k=k%N;
for(i=0;i<N;i++)
b[(i+k)%N]=a[i];
for(i=0;i<N;i++)
cout<<b[i]<<" ";
return 0;
}