PAT 1008(数组循环右移问题)

1008 数组元素循环右移问题 (20分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A?0??A?1???A?N−1??)变换为(A?N−M???A?N−1??A?0??A?1???A?N−M−1??)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格

本题考虑三种情况:1、M==N 2、M%N==0 3、M%N!=0

	#include<iostream>
	using namespace std;
	int main()
	{
		int arry[1000] = { 0 };
		int N = 0, M = 0;
		cin >> N >> M;
		//检测输入的M N是否满足要求
		while (N < 1 || N>100||M<0)
		{
			cin >> N>>M;
		}
		//解决M%N!=0的情况
		if ((M % N) != 0)
		{
			M = M % N;
		}
		for (int i = M; i <N+M; i++)
		{
			cin >> arry[i];
		}
		//普通情况下的移位
		if (N >= M)
		{
			for (int j = N; j < N + M; j++)
			{
				arry[j - N] = arry[j];
			}
			for (int k = 0; k < N; k++)
			{
				cout << arry[k];
				if (k != N - 1)
				{
					cout << " ";
				}
			}
		}
		//因为我采用的是在特殊位置输入数组,所以M==N时采用下面的条件
		else if((M%N)==0)
		{
			for (int i = M; i < N+M; i++)
			{
				cout << arry[i];
				if (i != N+M- 1)
				{
					cout << " ";
				}
			}
		}
		return 0;
	}
	//M=N,M%N==0,M%N!=0;

原文地址:https://www.cnblogs.com/zongji/p/12228944.html

时间: 2024-10-29 19:06:44

PAT 1008(数组循环右移问题)的相关文章

PAT 1008 数组元素循环右移问题

PAT 1008 数组元素循环右移问题 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格分隔.

线性表(一)&mdash;&mdash;数组循环右移算法

源码:rshift.cpp #include "stdafx.h" #include <stdio.h> /************************************************************************/ /* 数组循环右移算法 */ /************************************************************************/ /* * 要求:只用一个元素大小的辅助空间

数组循环右移

Q:把一个含有 N 个元素的数组循环右移 K 位,要求时间复杂度为 O (N),且只允许使用两个附加变量. 开始的思路: 1.若k=整数倍N, 完成:k大于N,k=N%k:k小于N,开始处理. 2.tmp1保存取出的元素a[k]:a[0]放在k:tmp2保存a[2k], tmp1放入2k:tmp1保存a[3k],tmp2放入3k...直到位置[0]被放入一个新值,一轮循环完毕.这是一个从位置[0]出发,又回到位置[0]的接龙游戏. 仔细考虑下,发现,若N%k==0,则需要从[0]开始,[0]结束

数组循环右移问题

首先,假设我们有一个具有6个元素的数组: 1,2,3,4,5,6 现在我们要对这个数组循环右移4次,我们很直接很够推出它的结果是:3,4,5,6,1,2 .但是我们如何去实现这样一个问题呢? 我觉得大家最容易想到的方法就是: step1:保存好数组中最后一个元素的值 step2:从第一个元素到倒数第二个元素依次向右移动一个位置 step3:然后将刚保存的值放到空出来的数组第一个位置 虽然这个方法想起来很简单,但是它的效率却不是很高,它的时间复杂度是O(n^2). 现在,我再介绍一种效率较高的算法

(转)数组循环右移

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次.abcd1234→4abcd123→34abcd12→234abcd1→1234abcd.伪代码如下: 代码清单2-33 RightShift(int* arr, int N, int K) { while(K--) { int t = arr[N - 1]; for(int i = N - 1; i >

pat 1008. 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移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位以

习题8-3 数组循环右移(20 分)

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a?0??a?1???a?n?1??)变换为(a?n?m???a?n?1??a?0??a?1???a?n?m?1??)(最后m个数循环移至最前面的m个位置). 函数接口定义: int ArrayShift( int a[], int n, int m ); 其中a[]是用户传入的数组:n是数组的大小:m是右移的位数.函数ArrayShift须将循环右移后的数组仍

【算法编程】循环右移一个数组

仅用一个辅助节点将一个大小为n数组循环右移k位的三种办法: 1.时间复杂度最大:将所有元素每次只移动一位,总共移动k次,程序实现十分容易,在此就不具体实现了. 2.时间复杂度适中:依次将每个元素都放到辅助节点上,然后将其储存到目的节点,具体程序如下: #include<iostream> using namespace std; int gcd(int x,int y); int main() { int n,k; cout<<"请输入数组的维数"<<

[PAT乙级] Practise 1008 数组元素循环右移问题

PAT (Basic Level) Practice (中文)1008 1008 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1?AN?1)变换为(AN?M?AN?1A0A1?AN?M?1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0):第2行输入N个整数,之