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

题目描述

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

给出一个长度为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;
}

				
时间: 2024-10-10 14:44:06

看起来水的题----数组右移的相关文章

code第一部分数组:第十六题 数组表示数,加一操作

code第一部分数组:第十六题  数组表示数,加一操作 Given a number represented as an array of digits, plus one to the number. #include <iostream> #include <stdlib.h> #include <stdio.h> #include <vector> using namespace std; int * addone(int *a,int n) { in

算法题——数组内有序对的最大距离

题目:给定一个数组A,对于下标i < j,有A[i] < A[j],求j - i 的最大值. 思路:先正序遍历一次,利用一个辅助数组,记录每个元素的左边子数组中最小值的下标:然后倒序遍历,维持两个指针,初始都指向最后一个元素,通过移动两个指针,找出最大距离. 代码: 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int maxDist(int num[], int n) 6 {

[ACM] Color the ball [线段树水题][数组开大]

Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? Input 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N).  当N

经典题---数组改“貌”

假设有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 首先,当我看到这个题时,觉得很easy嘛.设两个指针,一个指针指向头,一个指针指向尾.交换就ok啦...但是,当我输出结果的时候傻眼啦.它长这个样子"i ma a tneduts".和题目要求还差一步.之后,只需将每个单词翻转就好了.经过这个题后啊,博主我呀,决定以后看题至少读三遍,读三遍,读三遍...

【BZOJ2049】【SDOI2008】Cave 洞穴勘测 LCT裸题 模版题 数组版

数组,至少目前我只写数组,不写指针. LCT这种东西我不打算讲或者什么乱七八糟的,反正这一篇是自用. 同样,看这篇博客的人可以先去别的地方学LCT,然后来我这扒代码. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ls son[x][0] #define rs son[x][1] #define is(x) (x==son[f

数组右移

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 public static void main(String[] args) { Random random = new Random(); int len = random.nextInt(5)+5; //数长度为5到10 int[] arr = new int[len]; for (int i = 0; i < arr.length; i++) { arr[i] = random.nextInt(100); }

数据结构算法题-数组字符串

1.查找最小的 k 个元素(数组) 题目:输入 n 个整数,输出其中最小的 k 个. 例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. k_big.c 2.查找最小的 k 个元素(数组) 题目:输入 n 个整数,输出其中最小的 k 个. 例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4 k_big.c 3.判断一个字符串是否对称 1 bool CheckStr(const char*

FCC 中级算法题 数组扁平化

Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数组连接; (2)如果不是数组,就直接添加进新数组: 知识点: (1)Array.concat()方法用于合并两个或多个数组.此方法不会更改现有数组,而是返回一个新数组; (2)Array.push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度; (3)Array.isArray()用于

算法题-数组的最长非递减子序列

1 int binSearch(const vector<int> &tail, int len, int key)// 2 { 3 int left = 0, right = len - 1; 4 int mid; 5 6 while(left <= right) 7 { 8 mid = left + ((right - left) >> 1); 9 if(tail[mid] == key) 10 return mid; 11 else if(tail[mid] &