首页 > 代码库 > 看起来水的题----数组右移

看起来水的题----数组右移

题目描述

          听说有人觉得自己已经掌握了数组,那么我现在就来考考你们吧!

         给出一个长度为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逆置 变成 4321
2.将567逆置 变成 765
3.将两个逆置数组拼接: 4321765
4.将这个已拼接的数组逆置: 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;
}

 


看起来水的题----数组右移