数组元素循环右移问题
问题描述
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0 A1 ⋯AN−1 )变换为(AN−M ⋯AN−1 A0 A1 ⋯AN−M−1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
解决方法:我一开始想的是扩大数组
#include<iostream>
using namespace std;
int main()
{
int n,m,a[205],k=0;
cin>>n>>m;
m=m%n;//划重点,这是我一开始没想到的,但是后来怎么想到的呢,看别的博主的解题i,哈哈哈哈哈哈哈哈
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=n-m;i<n;i++)
{
a[n+k]=a[i];//把即将要往前面移动的数,往后挪
k++;
}
for(int i=n-m-1;i>=0;i--)
{
a[i+m]=a[i];//把除了往前走的数组往后移m位
}
for(int i=n;i<=n+m-1;i++)
{
a[i-n]=a[i];//把在后面的数移到前面去
}
for(int i=0;i<n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n-1];
return 0;
}
但是呢,我在别的博主那里看到了别的解题思路自测-3 数组元素循环右移问题 (20分)( 用数组模拟双链表)
我就思考他的思考,以下是他的代码
//用数组模拟双链表,根据m找到头结点,输出双链表
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int q[N];
int pre[N],ne[N];
int head;//头结点
int j;//一个动态的指指指,指来指去
int n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<=n-1;i++)//构建双链表
{
cin>>q[i];//输入数组
pre[i]=i-1;
ne[i]=i+1;
}
pre[0]=n-1;//第一个指到最后面去了
ne[n-1]=0;//最后一个指到第一个去了
head=0;
for(int i=0;i<=m-1;i++)
{
head=pre[head];//找到头指针的位置,最后找到了要移到前面去的那个数的位置
}
//输出双链表
j=head;
cout<<q[j];
for(int i=1;i<=n-1;i++)
{
j=ne[j];
cout<<" "<<q[j];
}
return 0;
}