题目描述
听说有人觉得自己已经掌握了数组,那么我现在就来考考你们吧!
给出一个长度为n的数组a,要求在不使用另外数组的前提下,将数组中的每一个整数循环向右移m(m>=0)个位置,即将a中的数据由(a0 a1……aN-1)变换为(aN-M …… aN-1 a0 a1……aN-M-1)(即:最后m个数循环移至最前面的m个位置)。
现在要求你的程序移动数据的次数尽量少,这要如何设计移动的方法呢?
输入
第1行输入n ( 1<=n<=100)、m(m>=0)
第2行输入n个整数,之间用空格分隔
输出
在一行中输出循环右移m位以后的整数数组,之间用空格分隔,数组结尾不能有多余空格。
样例输入
6 1 2 3 4 5 6 1
样例输出
1 2 3 4 5 6//一开始我觉得很简单,觉得用两个数组就可以。原谅我没仔细看题。后来想了好久,都没想出来,参考下别人的代码,觉得世界真奇妙!方法一:m个位置的向后移动,相当于一个一个的往后移直到你喜欢的样子。方法二:假如原数组: 1 2 3 4 5 6 7 需要右移4次,那么我们想要的结果是: 5 6 7 1 2 3 4。1.将1234逆置 变成 43212.将567逆置 变成 7653.将两个逆置数组拼接: 43217654.将这个已拼接的数组逆置: 5671234 就成了我们想要的结果了。
void
RightShift(
int
* arr,
int
N,
int
K){
K = K%N;
//对应上文步骤
Reverse(arr,
0
,K-
1
);
//1
Reverse(arr,K,N-
1
);
//2
Reverse(arr,
0
,N-
1
);
//4,看到这儿顺便复习下我忘记的reverse函数
由于懒,宝宝只实现了一种
#include<iostream>
using namespace std;
int main()
{
int a[100];
int n, m,t;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
while (m--)
{
t = a[n-1];
for (int i = n-1; i>=0; i--)
{
a[i] = a[i - 1];
}
a[0] = t;
}
for (int i = 0; i < n - 1; i++)
{
cout << a[i] << " ";
}
cout << a[n-1] << endl;
}